Aby wyjaśnić wszystkie kroki, które musisz wykonać, aby dodać dane podstawowe do projektu, który wcześniej ich nie miał:
Krok 1: Dodaj strukturę
Kliknij miejsce docelowe aplikacji (w lewym okienku jest to górna ikona z nazwą aplikacji), a następnie przejdź do zakładki „Fazy tworzenia”, a następnie „Połącz pliki binarne z bibliotekami”, kliknij mały „+” u dołu i znajdź „CoreData.framework” i dodaj go do swojego projektu
Następnie zaimportuj coredata do wszystkich obiektów, których potrzebujesz (w sposób nie-sexy), używając:
Szybki
import CoreData
Cel C
#import <CoreData/CoreData.h>
lub dodaj import poniżej wspólnych importów w pliku .pch (znacznie bardziej efektownie) w następujący sposób:
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
#endif
Krok 2: Dodaj model danych
Aby dodać plik .xcdatamodel, kliknij prawym przyciskiem myszy / kliknij z naciśniętym klawiszem Control na swoje pliki w prawym okienku (jak w folderze Zasoby do bezpiecznego przechowywania) i wybierz opcję Dodaj nowy plik, kliknij kartę Dane podstawowe podczas wybierania typu pliku, a następnie kliknij przycisk ' Model danych ', nadaj mu nazwę i kliknij Dalej i Zakończ, a doda go do twojego projektu. Po kliknięciu tego obiektu modelu zobaczysz interfejs umożliwiający dodanie jednostek do projektu z dowolnymi relacjami, które chcesz.
Krok 3: Zaktualizuj pełnomocnika aplikacji
W Swift na 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
}
W celu C upewnij się, że dodajesz te obiekty do 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
Zsyntetyzuj poprzednie obiekty w AppDelegate.m w następujący sposób:
@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;
Następnie dodaj te metody do AppDelegate.m (pamiętaj, aby umieścić nazwę dodanego modelu w pokazanych miejscach):
- (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];
}
Krok 4: Pobierz obiekty danych do kontrolerów ViewControllers tam, gdzie potrzebujesz danych
Opcja 1. Użyj ManagedObjectContext delegata aplikacji z VC (preferowane i łatwiejsze)
Zgodnie z sugestią @ brass-kazoo - Pobierz odwołanie do AppDelegate i jego managedObjectContext poprzez:
Szybki
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
appDelegate.managedObjectContext
Cel C
[[[UIApplication sharedApplication] delegate] managedObjectContext];
w Twoim ViewController
Opcja 2. Utwórz ManagedObjectContext w swoim VC i dopasuj go do AppDelegate z AppDelegate (Original)
Pokazuje tylko starą wersję dla celu C, ponieważ jest znacznie łatwiejsza w użyciu preferowanej metody
w ViewController.h
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
W pliku ViewController. M
@synthesize managedObjectContext = _managedObjectContext;
W AppDelegate lub klasie, w której jest tworzony ViewController, ustaw managedObjectContext tak, aby był taki sam jak AppDelegate
ViewController.managedObjectContext = self.managedObjectContext;
Jeśli chcesz, aby kontroler widoku korzystający z podstawowych danych był kontrolerem FetchedResultsController, musisz upewnić się, że te elementy znajdują się w Twoim ViewController.h
@interface ViewController : UIViewController <NSFetchedResultsControllerDelegate> {
NSFetchedResultsController *fetchedResultsController;
NSManagedObjectContext *managedObjectContext;
}
@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;
A to jest w ViewController.m
@synthesize fetchedResultsController, managedObjectContext;
Po tym wszystkim możesz teraz użyć tego managedObjectContext do uruchamiania wszystkich zwykłych żądań fetchRequests potrzebnych do dobroci CoreData! Cieszyć się