Juste pour expliquer toutes les étapes que vous devez réellement effectuer pour ajouter des données de base à un projet qui ne les avait pas auparavant:
Étape 1: ajouter le cadre
Cliquez sur la cible de votre application (sur le volet de gauche, c'est l'icône du haut avec le nom de votre application) puis allez dans l'onglet 'Build Phases' puis sur 'Link Binary With Libraries', cliquez sur le petit '+' en bas puis trouvez 'CoreData.framework' et ajoutez-le à votre projet
Ensuite, soit importez des coredata sur tous les objets dont vous avez besoin (de manière non sexy) en utilisant:
Rapide
import CoreData
Objectif c
#import <CoreData/CoreData.h>
ou ajoutez l'importation sous les importations courantes dans votre fichier .pch (beaucoup plus sexy) comme ceci:
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
#endif
Étape 2: ajouter le modèle de données
Pour ajouter le fichier .xcdatamodel, faites un clic droit / contrôle-cliquez sur vos fichiers dans le volet de droite (comme dans un dossier Ressources pour une conservation en toute sécurité) et sélectionnez Ajouter un nouveau fichier, cliquez sur l'onglet Données de base lors de la sélection de votre type de fichier, puis cliquez sur ' Modèle de données ', donnez-lui un nom et cliquez sur Suivant et Terminer et il l'ajoutera à votre projet. Lorsque vous cliquez sur cet objet modèle, vous verrez l'interface pour ajouter les entités à votre projet avec les relations que vous souhaitez.
Étape 3: mettre à jour le délégué d'application
Dans Swift sur 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
}
Dans Objective C, assurez-vous d'ajouter ces objets à 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
Synthétisez les objets précédents dans AppDelegate.m comme ceci:
@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;
Ajoutez ensuite ces méthodes à AppDelegate.m (assurez-vous de mettre le nom du modèle que vous avez ajouté dans les emplacements indiqués):
- (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];
}
Étape 4: acheminez les objets de données vers les ViewControllers là où vous avez besoin des données
Option 1. Utilisez ManagedObjectContext du délégué d'application à partir de VC (préféré et plus facile)
Comme suggéré par @ brass-kazoo - Récupérez une référence à AppDelegate et à son managedObjectContext via:
Rapide
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
appDelegate.managedObjectContext
Objectif c
[[[UIApplication sharedApplication] delegate] managedObjectContext];
dans votre ViewController
Option 2. Créez ManagedObjectContext dans votre VC et faites-le correspondre à AppDelegate de AppDelegate (Original)
Afficher uniquement l'ancienne version pour Objective C car il est beaucoup plus facile d'utiliser la méthode préférée
dans le ViewController.h
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
Dans le ViewController.m
@synthesize managedObjectContext = _managedObjectContext;
Dans l'AppDelegate, ou la classe où le ViewController est créé, définissez managedObjectContext pour qu'il soit identique à celui d'AppDelegate
ViewController.managedObjectContext = self.managedObjectContext;
Si vous voulez que le viewcontroller utilisant Core Data soit un FetchedResultsController, vous devez vous assurer que ce contenu est dans votre ViewController.h
@interface ViewController : UIViewController <NSFetchedResultsControllerDelegate> {
NSFetchedResultsController *fetchedResultsController;
NSManagedObjectContext *managedObjectContext;
}
@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;
Et c'est dans ViewController.m
@synthesize fetchedResultsController, managedObjectContext;
Après tout cela, vous pouvez maintenant utiliser ce managedObjectContext pour exécuter toutes les requêtes fetchRequests habituelles nécessaires à la bonté CoreData! Prendre plaisir