Saya ingin menambahkan data inti ke proyek iPhone yang ada, tapi saya masih mendapatkan banyak kesalahan kompilasi:
- NSManagedObjectContext undeclared
- Expected specifier-qualifier-list before 'NSManagedObjectModel'
- ...
Saya sudah menambahkan Kerangka Data Inti ke target (klik kanan pada proyek saya di bawah "Target", "Tambah" - "Kerangka Kerja yang Ada", "CoreData.framework").
File header saya:
NSManagedObjectModel *managedObjectModel;
NSManagedObjectContext *managedObjectContext;
NSPersistentStoreCoordinator *persistentStoreCoordinator;
[...]
@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;
Apa yang saya lewatkan? Memulai proyek baru bukanlah suatu pilihan ...
Terima kasih banyak!
sunting
maaf, saya memiliki implementasi-implementasi itu ... tetapi sepertinya Perpustakaan tidak ada ... metode implementasi penuh dengan kompilasi kesalahan seperti " managedObjectContext undeclared
", " NSPersistentStoreCoordinator undeclared
", tetapi juga dengan "Diharapkan ')' sebelum NSManagedObjectContext
" (walaupun Sepertinya tanda kurung sudah benar) ...
#pragma mark -
#pragma mark Core Data stack
/**
Returns the managed object context for the application.
If the context doesn't already exist, it is created and bound to the persistent store
coordinator for the application.
*/
- (NSManagedObjectContext *) managedObjectContext {
if (managedObjectContext != nil) {
return managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
managedObjectContext = [[NSManagedObjectContext alloc] init];
[managedObjectContext setPersistentStoreCoordinator: coordinator];
}
return managedObjectContext;
}
/**
Returns the managed object model for the application.
If the model doesn't already exist, it is created by merging all of the models found in
application bundle.
*/
- (NSManagedObjectModel *)managedObjectModel {
if (managedObjectModel != nil) {
return managedObjectModel;
}
managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
return managedObjectModel;
}
/**
Returns the persistent store coordinator for the application.
If the coordinator doesn't already exist, it is created and the application's store added to it.
*/
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (persistentStoreCoordinator != nil) {
return persistentStoreCoordinator;
}
NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory]
stringByAppendingPathComponent: @"Core_Data.sqlite"]];
NSError *error = nil;
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]
initWithManagedObjectModel:[self managedObjectModel]];
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil URL:storeUrl options:nil error:&error]) {
/*
Replace this implementation with code to handle the error appropriately.
abort() causes the application to generate a crash log and terminate. You should
not use this function in a shipping application, although it may be useful during
development. If it is not possible to recover from the error, display an alert panel that
instructs the user to quit the application by pressing the Home button.
Typical reasons for an error here include:
* The persistent store is not accessible
* The schema for the persistent store is incompatible with current managed object
model
Check the error message to determine what the actual problem was.
*/
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return persistentStoreCoordinator;
}
Untuk menguraikan semua langkah yang sebenarnya perlu Anda lakukan untuk menambahkan Data Inti ke proyek yang sebelumnya tidak memilikinya:
Langkah 1: Tambahkan Kerangka
Klik pada target aplikasi Anda (pada panel kiri dengan ikon atas dengan nama aplikasi Anda) kemudian pergi ke tab 'Bangun Fase' kemudian pada 'Tautan Biner Dengan Perpustakaan', klik '+' kecil di bagian bawah lalu cari 'CoreData.framework' dan tambahkan ke proyek Anda
Kemudian impor coredata pada semua objek yang Anda perlukan (cara non-seksi) menggunakan:
Cepat
Tujuan C
atau tambahkan impor di bawah impor umum dalam file .pch Anda (jauh lebih seksi) seperti ini:
Langkah 2: Tambahkan Model Data
Untuk menambahkan file .xcdatamodel klik kanan / kontrol-klik pada file Anda di panel kanan (seperti dalam folder Resources untuk menjaga aman) dan pilih untuk Menambahkan File Baru, Klik tab Data Inti ketika memilih jenis file Anda lalu Klik ' Model Data ', berikan nama dan klik Next dan Finish dan itu akan menambahkannya ke proyek Anda. Ketika Anda mengklik objek Model ini, Anda akan melihat antarmuka untuk menambahkan Entitas ke proyek Anda dengan hubungan apa pun yang Anda inginkan.
Langkah 3: Perbarui Delegasi Aplikasi
Di Swift di AppDelegate.swift
Di Objective C pastikan untuk menambahkan objek-objek ini ke AppDelegate.h
Sintesis objek sebelumnya di AppDelegate.m seperti ini:
Kemudian tambahkan metode ini ke AppDelegate.m (pastikan untuk memasukkan nama model yang Anda tambahkan di tempat yang ditunjukkan):
Langkah 4: Dapatkan Objek Data ke ViewControllers Di mana Anda Membutuhkan Data
Opsi 1. Gunakan ManagedObjectContext App Delegate dari VC (Diutamakan dan Lebih Mudah)
Seperti yang disarankan oleh @ brass-kazoo - Ambil referensi ke AppDelegate dan managedObjectContext melalui:
Cepat
Tujuan C
di ViewController Anda
Opsi 2. Buat ManagedObjectContext di VC Anda dan memilikinya cocok dengan AppDelegate dari AppDelegate (Asli)
Hanya menampilkan versi lama untuk Objective C karena jauh lebih mudah untuk menggunakan metode yang disukai
di ViewController.h
Di ViewController.m
Di AppDelegate, atau kelas tempat ViewController dibuat, atur managedObjectContext agar sama dengan AppDelegate
Jika Anda ingin viewcontroller menggunakan Core Data menjadi FetchedResultsController maka Anda harus memastikan hal ini ada di ViewController.h Anda
Dan ini ada di ViewController.m
Setelah semua itu, Anda sekarang dapat menggunakan ini managedObjectContext untuk menjalankan semua fetchRequests biasa yang diperlukan untuk kebaikan CoreData! Nikmati
sumber
[[UIApplication sharedApplication] delegate]
dan kemudian konteks via[appDelegate managedObjectContext]
Untuk Swift 3: TERMASUK MENYIMPAN DAN MENGEMBALIKAN DATA
Langkah 1 : Tambahkan Kerangka
Langkah 2: Tambahkan model Data
File> Baru> File> Data Inti> Model Data
SampleData
yang dihasilkanSampleData.xcdatamocelId
Langkah 3: Tambahkan fungsi di bawah ini ke Delegasi Aplikasi Anda dan tambahkan "impor CoreData" ke atas
LANGKAH 4: Menambahkan Entitas dan Atribut ke Model
a) Tambahkan Entitas
b) Tambahkan Atribut
LANGKAH 5: Menyimpan Data
LANGKAH 5: Mengambil Data
sumber
Coba buat aplikasi Kakao yang didukung Data Inti dan lihat di AppDelegate. Anda akan melihat metode implementasi tumpukan data inti di sana serta file model objek yang dikelola untuk mendefinisikan entitas Anda dan hal-hal lain yang dirilis data inti.
Anda telah menunjukkan kepada kami hanya tajuk (yaitu deklarasi), tetapi bukan implementasi (yaitu definisi) dari tumpukan Data Inti.
sumber
Jika Anda mengalami masalah yang sama di xcode 4, seperti yang saya lakukan. Berbeda: saya harus memilih proyek, kemudian dalam target memperluas "Link Binary With Libraries" yang menunjukkan perpustakaan saat ini. Dari sana klik tanda + (plus tanda) untuk memilih perpustakaan tambahan yang Anda butuhkan. Saya menempatkannya di bagian atas proyek dan harus memindahkannya (seret dan lepas) ke Grup Kerangka , tetapi hanya itu.
sumber
Seperti yang dikatakan Eimantas, Anda kehilangan implementasi Core Stack
Solusi yang akan dibuat adalah membuat proyek driver data inti baru dan menyalin / menempel implementasi ke proyek Anda.
sumber
Untuk Swift 3:
File-> file baru-> CoreData-> Model untuk membuat model.
Lihat tautan ini untuk informasi lebih lanjut tentang cara mengimplementasikannya.
sumber
// di Swift 2.2, Anda dapat melakukan hal berikut tanpa mengubah file AppDelegate.
File-> file baru-> ios-> cocoa Touch class -> atur subclass-nya sebagai NSObject-> beri nama sebagai DataController.swift Di dalam file termasuk ///
impor UIKit mengimpor kelas CoreData DataController: NSObject {
}
//////
/////// seed () -> def
// ambil () def
sumber
view.h
detail. h
sumber
.h
sumber
sumber
sumber
contoh pengkodean tampilan1
tampilan detail sampel
savebutton
sumber