Daha önce içermeyen bir projeye Temel Verileri eklemek için gerçekten gerçekleştirmeniz gereken tüm adımları açıklamak için:
1. Adım: Çerçeveyi ekleyin
Uygulama hedefinizi tıklayın (sol bölmede, uygulamanızın adıyla birlikte en üstteki simgedir), ardından 'Aşamaları Oluştur' sekmesine gidin, ardından 'İkili Kitaplıklarıyla Bağla' seçeneğinde, alttaki küçük '+' işaretini tıklayın ve ardından 'CoreData.framework' ve projenize ekleyin
Ardından, ihtiyacınız olan tüm nesnelere (seksi olmayan yol) kullanarak çekirdek verileri içe aktarın:
hızlı
import CoreData
Hedef C
#import <CoreData/CoreData.h>
veya içe aktarmayı .pch dosyanızdaki (çok daha seksi) genel içe aktarma işlemlerinin altına ekleyin:
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
#endif
2. Adım: Veri Modelini ekleyin
.Xcdatamodel dosyasını eklemek için sağ bölmedeki dosyalarınızı sağ tıklayın / control tuşunu basılı tutarak tıklayın (güvenli tutmak için Kaynaklar klasöründe olduğu gibi) ve Yeni Dosya Ekle'yi seçin, dosya türünüzü seçerken Temel Veri sekmesini tıklayın ve ardından ' Veri Modeli 'olarak adlandırın, bir ad verin ve İleri ve Son'u tıkladığınızda projenize ekleyecektir. Bu Model nesnesine tıkladığınızda, varlıkları istediğiniz herhangi bir ilişkiyle projenize eklemek için arabirimi göreceksiniz.
3. Adım: Uygulama Temsilcisini güncelleyin
In Swift AppDelegate.swift üzerinde
//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
}
Gelen Objective C marka emin AppDelegate.h için bu nesneleri eklemek için
@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
AppDelegate.m dosyasındaki önceki nesneleri şu şekilde sentezleyin:
@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;
Ardından bu yöntemleri AppDelegate.m dosyasına ekleyin (eklediğiniz modelin adını gösterilen noktalara koyduğunuzdan emin olun):
- (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];
}
Adım 4: Veri Nesnelerini Verilere İhtiyacınız Olan ViewControllers'a Alın
1. Seçenek. Uygulama Temsilcisinin VC'den ManagedObjectContext'ini (Tercih Edilen ve Daha Kolay) Kullanma
@ Brass-kazoo tarafından önerildiği gibi - AppDelegate ve yönetilenObjectContext ürününe bir referans alın:
hızlı
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
appDelegate.managedObjectContext
Hedef C
[[[UIApplication sharedApplication] delegate] managedObjectContext];
ViewController'ınızda
2. Seçenek. VC'nizde ManagedObjectContext oluşturun ve AppDelegate'ten AppDelegate'lerle eşleşmesini sağlayın (Orijinal)
Tercih edilen yöntemi kullanmak çok daha kolay olduğu için yalnızca Objective C için eski sürümü gösteriliyor
ViewController.h içinde
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
ViewController.m içinde
@synthesize managedObjectContext = _managedObjectContext;
AppDelegate veya ViewController'ın oluşturulduğu sınıfta, yönetilenObjectContext'i AppDelegate ile aynı olacak şekilde ayarlayın
ViewController.managedObjectContext = self.managedObjectContext;
Core Data kullanan viewcontroller öğesinin FetchedResultsController olmasını istiyorsanız, bu öğelerin ViewController.h dosyasında olduğundan emin olmanız gerekir.
@interface ViewController : UIViewController <NSFetchedResultsControllerDelegate> {
NSFetchedResultsController *fetchedResultsController;
NSManagedObjectContext *managedObjectContext;
}
@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;
Ve bu ViewController.m'de
@synthesize fetchedResultsController, managedObjectContext;
Tüm bunlardan sonra artık CoreData iyiliği için gereken tüm olağan fetchRequests çalıştırmak için bu manageObjectContext kullanabilirsiniz! Zevk almak