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
import CoreData
Tujuan C
#import <CoreData/CoreData.h>
atau tambahkan impor di bawah impor umum dalam file .pch Anda (jauh lebih seksi) seperti ini:
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
#endif
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
//replace the previous version of applicationWillTerminate with this
func applicationWillTerminate(application: UIApplication) {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
// Saves changes in the application's managed object context before the application terminates.
self.saveContext()
}
func saveContext () {
var error: NSError? = nil
let managedObjectContext = self.managedObjectContext
if managedObjectContext != nil {
if managedObjectContext.hasChanges && !managedObjectContext.save(&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.
//println("Unresolved error \(error), \(error.userInfo)")
abort()
}
}
}
// #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.
var managedObjectContext: NSManagedObjectContext {
if !_managedObjectContext {
let coordinator = self.persistentStoreCoordinator
if coordinator != nil {
_managedObjectContext = NSManagedObjectContext()
_managedObjectContext!.persistentStoreCoordinator = coordinator
}
}
return _managedObjectContext!
}
var _managedObjectContext: NSManagedObjectContext? = nil
// Returns the managed object model for the application.
// If the model doesn't already exist, it is created from the application's model.
var managedObjectModel: NSManagedObjectModel {
if !_managedObjectModel {
let modelURL = NSBundle.mainBundle().URLForResource("iOSSwiftOpenGLCamera", withExtension: "momd")
_managedObjectModel = NSManagedObjectModel(contentsOfURL: modelURL)
}
return _managedObjectModel!
}
var _managedObjectModel: NSManagedObjectModel? = nil
// 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.
var persistentStoreCoordinator: NSPersistentStoreCoordinator {
if !_persistentStoreCoordinator {
let storeURL = self.applicationDocumentsDirectory.URLByAppendingPathComponent("iOSSwiftOpenGLCamera.sqlite")
var error: NSError? = nil
_persistentStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
if _persistentStoreCoordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: nil, error: &error) == nil {
/*
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.
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.
If the persistent store is not accessible, there is typically something wrong with the file path. Often, a file URL is pointing into the application's resources directory instead of a writeable directory.
If you encounter schema incompatibility errors during development, you can reduce their frequency by:
* Simply deleting the existing store:
NSFileManager.defaultManager().removeItemAtURL(storeURL, error: nil)
* Performing automatic lightweight migration by passing the following dictionary as the options parameter:
[NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true}
Lightweight migration will only work for a limited set of schema changes; consult "Core Data Model Versioning and Data Migration Programming Guide" for details.
*/
//println("Unresolved error \(error), \(error.userInfo)")
abort()
}
}
return _persistentStoreCoordinator!
}
var _persistentStoreCoordinator: NSPersistentStoreCoordinator? = nil
// #pragma mark - Application's Documents directory
// Returns the URL to the application's Documents directory.
var applicationDocumentsDirectory: NSURL {
let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
return urls[urls.endIndex-1] as NSURL
}
Di Objective C pastikan untuk menambahkan objek-objek ini ke AppDelegate.h
@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;
- (NSURL *)applicationDocumentsDirectory; // nice to have to reference files for core data
Sintesis objek sebelumnya di AppDelegate.m seperti ini:
@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;
Kemudian tambahkan metode ini ke AppDelegate.m (pastikan untuk memasukkan nama model yang Anda tambahkan di tempat yang ditunjukkan):
- (void)saveContext{
NSError *error = nil;
NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
if (managedObjectContext != nil) {
if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}
}
- (NSManagedObjectContext *)managedObjectContext{
if (_managedObjectContext != nil) {
return _managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
_managedObjectContext = [[NSManagedObjectContext alloc] init];
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return _managedObjectContext;
}
- (NSManagedObjectModel *)managedObjectModel{
if (_managedObjectModel != nil) {
return _managedObjectModel;
}
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"NAMEOFYOURMODELHERE" withExtension:@"momd"];
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return _managedObjectModel;
}
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
}
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"NAMEOFYOURMODELHERE.sqlite"];
NSError *error = nil;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return _persistentStoreCoordinator;
}
#pragma mark - Application's Documents directory
// Returns the URL to the application's Documents directory.
- (NSURL *)applicationDocumentsDirectory{
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}
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
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
appDelegate.managedObjectContext
Tujuan C
[[[UIApplication sharedApplication] delegate] managedObjectContext];
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
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
Di ViewController.m
@synthesize managedObjectContext = _managedObjectContext;
Di AppDelegate, atau kelas tempat ViewController dibuat, atur managedObjectContext agar sama dengan AppDelegate
ViewController.managedObjectContext = self.managedObjectContext;
Jika Anda ingin viewcontroller menggunakan Core Data menjadi FetchedResultsController maka Anda harus memastikan hal ini ada di ViewController.h Anda
@interface ViewController : UIViewController <NSFetchedResultsControllerDelegate> {
NSFetchedResultsController *fetchedResultsController;
NSManagedObjectContext *managedObjectContext;
}
@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;
Dan ini ada di ViewController.m
@synthesize fetchedResultsController, managedObjectContext;
Setelah semua itu, Anda sekarang dapat menggunakan ini managedObjectContext untuk menjalankan semua fetchRequests biasa yang diperlukan untuk kebaikan CoreData! Nikmati