AppDelegate with NSManagedObjectContext
See my post about Data Access Object(Core Data(Data Access Object)).
NSManagedObjectContext is used in every situation.
Also, we need to connect data base file(.sqlite) and Model definition file(.xcadatamodeledl).
This entry is for it.
This is the last entry to learn CoreData.
Unfortunately, this entry doesn’t cover multithread issue.
My other entry covers this. Please see. CoreData(マルチスレッドの処理 )
AppDelegate.h
Prepare several data for CoreData.
@interface AppDelegate : UIResponder <UIApplicationDelegate> @property (strong, nonatomic) UIWindow *window; // Core Data @property (nonatomic, strong, readonly) NSManagedObjectModel *managedObjectModel; @property (nonatomic, strong, readonly) NSManagedObjectContext *managedObjectContext; @property (nonatomic, strong, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator; +(AppDelegate *)me; -(void)saveContext; @end
NSManagedObjectModel, NSManagedObjectContext, NSPersistentStoreCoordinator is core part of CoreData.
me, saveContext is helper for CoreData.
AppDelegate.m
I show you the core.
@interface AppDelegate() @property(nonatomic, readwrite)NSManagedObjectContext *managedObjectContext; @property(nonatomic, readwrite)NSManagedObjectModel *managedObjectModel; @property(nonatomic, readwrite)NSPersistentStoreCoordinator *persistentStoreCoordinator; @end @implementation AppDelegate +(AppDelegate *)me { return [[UIApplication sharedApplication] delegate]; // To access AppDelegate } #pragma mark - #pragma mark CoreData -(NSManagedObjectContext *)managedObjectContext { if ( _managedObjectContext != nil ) { return _managedObjectContext; } NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; if ( coordinator != nil ) { _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; [_managedObjectContext setPersistentStoreCoordinator:coordinator]; } return _managedObjectContext; } - (NSManagedObjectModel *)managedObjectModel { if ( _managedObjectModel != nil ) { return _managedObjectModel; } // Path of .xcadatamodeld model file path NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Colomo" withExtension:@"momd"]; _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; return _managedObjectModel; } - (NSPersistentStoreCoordinator *)persistentStoreCoordinator { if ( _persistentStoreCoordinator != nil ) { return _persistentStoreCoordinator; } NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Colomo.sqlite"]; NSFileManager *fileManager = [NSFileManager defaultManager]; if ( ![fileManager fileExistsAtPath:[storeURL path]] ) { NSURL *defaultStoreURL = [[NSBundle mainBundle] URLForResource:@"Colomo" withExtension:@"sqlite"]; if ( defaultStoreURL ) { [fileManager copyItemAtURL:defaultStoreURL toURL:storeURL error:NULL]; } } NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]]; NSError *error; if ( ![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error] ) { NSLog(@"Unrevolved error %@, %@", error, [error userInfo]); abort(); } return _persistentStoreCoordinator; } - (NSURL *)applicationDocumentsDirectory { return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; } -(void)saveContext { NSError *error; if ( _managedObjectContext != nil ) { if ( [_managedObjectContext hasChanges] && ![_managedObjectContext save:&error] ) { abort(); } } } @end
managedObjectModel is for data model connection.
managedObjectContext is an important thing, to do any operation of CoreData.
This is singleton instance, so we use it everywhere we want.
saveContext is same as commit. Call this when you want to commit operations.
Prepare was done.
Let’s use DAO
We can access NSManagedObjectContext everywhere using [AppDelete me]
This can get AppDelegate instance.
This is example of DAO usage.
Create
SettingDAO *sdao = [[SettingDAO alloc] init]; [sdao createSetting:context number:1 key:kTheme value:0]; // Default is 0
Find
SettingDAO *sdao = [[SettingDAO alloc] init]; Setting *colorset = [sdao findByNumber:[AppDelegate me].managedObjectContext number:2];