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];