This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
ios-labs-s14:advanced-core [2014/02/25 15:47] mbarboi created |
ios-labs-s14:advanced-core [2014/02/26 10:28] (current) mbarboi |
||
---|---|---|---|
Line 6: | Line 6: | ||
Implementing CoreData into your application: | Implementing CoreData into your application: | ||
-Add CoreData framework | -Add CoreData framework | ||
- | -Import CoreData | + | -Import CoreData Headers |
+ | -Add methods to AppDelegate | ||
+ | Adding CoreData Accessors: | ||
+ | ====Adding CoreData Methods==== | ||
+ | *Add the following code to AppDelegate.h right before //@end// | ||
+ | <code> | ||
+ | @property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext; | ||
+ | @property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel; | ||
+ | @property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator; | ||
+ | |||
+ | - (void)saveContext; | ||
+ | - (NSURL *)applicationDocumentsDirectory; | ||
+ | </code> | ||
+ | |||
+ | *Add the following code to AppDelegate.m immediately after //@implementation// | ||
+ | <code> | ||
+ | @synthesize managedObjectContext = _managedObjectContext; | ||
+ | @synthesize managedObjectModel = _managedObjectModel; | ||
+ | @synthesize persistentStoreCoordinator = _persistentStoreCoordinator; | ||
+ | </code> | ||
+ | |||
+ | *Add the following code to AppDelegate.m right before //@end// | ||
+ | <code> | ||
+ | - (void)saveContext | ||
+ | { | ||
+ | NSError *error = nil; | ||
+ | NSManagedObjectContext *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. | ||
+ | NSLog(@"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. | ||
+ | - (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 from the application's model. | ||
+ | - (NSManagedObjectModel *)managedObjectModel | ||
+ | { | ||
+ | if (_managedObjectModel != nil) { | ||
+ | return _managedObjectModel; | ||
+ | } | ||
+ | NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"]; | ||
+ | _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; | ||
+ | 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 = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"_.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. | ||
+ | |||
+ | 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:@YES, NSInferMappingModelAutomaticallyOption:@YES} | ||
+ | |||
+ | Lightweight migration will only work for a limited set of schema changes; consult "Core Data Model Versioning and Data Migration Programming Guide" for details. | ||
+ | |||
+ | */ | ||
+ | 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]; | ||
+ | } | ||
+ | |||
+ | </code> | ||
+ | |||
+ | ===CoreData Vocabulary=== | ||
+ | -Persistent Store Coordinator- As the name suggest it is a coordinator , that coordinates between manage object context and low level file saved in our data base (Sqlite file) | ||
+ | -ManagedObjectContext- You can think of a managed object context as an intelligent scratch pad. When you fetch objects from a persistent store, you bring temporary copies onto the scratch pad . You can then modify those objects however you like. Unless you actually save those changes, however, the persistent store remains unaltered. | ||
+ | -NSManageObject Model- A managed object model is an instance of the NSManagedObjectModel class. It describes a schema (contains definitions) for objects (also called entities )—that you use in your application. Filename is *.xcmodeld | ||
+ | -Properties (of entity )- An entity’s properties are its attributes and relationships. Amongst other features, each property has a name and a type. |