CoreDataの基礎 その2

2010/08/06

CoreDataの基礎 その1|CoreDataの基礎 その2|CoreDataの基礎 その3|CoreDataの基礎 その4

次はCoreDataの基本部分の実装ファイルをみていきます。

CoreDataの基本部分の実装

CoreDataにチェックしてWindow-based Applicationプロジェクトを作成するとAppDelegateに以下のような雛形が作成されます。

#import "SongAppDelegate.h"

@implementation SongAppDelegate

@synthesize window;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    [window makeKeyAndVisible];
    return YES;
}
- (void)applicationWillResignActive:(UIApplication *)application {
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
}

- (void)applicationWillTerminate:(UIApplication *)application {
    NSError *error = nil;
    if (managedObjectContext_ != nil) {
        if ([managedObjectContext_ hasChanges] && ![managedObjectContext_ save:&error]) {
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        } 
    }
}
#pragma mark -
#pragma mark Core Data stack
- (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_;
    }
    NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"Song" ofType:@"momd"];
    NSURL *modelURL = [NSURL fileURLWithPath:modelPath];
    managedObjectModel_ = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];    
    return managedObjectModel_;
}
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
    
    if (persistentStoreCoordinator_ != nil) {
        return persistentStoreCoordinator_;
    }
    
    NSURL *storeURL = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"Song.sqlite"]];
    
    NSError *error = nil;
    persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
    }    
    return persistentStoreCoordinator_;
}

#pragma mark -
#pragma mark Application's Documents directory
- (NSString *)applicationDocumentsDirectory {
    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}


#pragma mark -
#pragma mark Memory management
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
}
- (void)dealloc {
    
    [managedObjectContext_ release];
    [managedObjectModel_ release];
    [persistentStoreCoordinator_ release];
    
    [window release];
    [super dealloc];
}

applicationWillTerminate

アプリケーション終了時にデータ(ManagedObjectContext)変更があった場合、保存エラー処理を記述するようです。

(NSManagedObjectContext *)managedObjectContext

NSFetchedResultsControllerのインスタンスです。 ここではgetterの役割でしょうか? NSManagedObjectContextインスタンスが生成されていなければ、新しく生成します。 その際、既に生成済みのNSPersistentStoreCoordinatorをsetします。

(NSPersistentStoreCoordinator *)persistentStoreCoordinator

これもgetterでしょう。 NSPersistentStoreCoordinatorが生成が生成されていなければ、新しく生成します。 その際、sqliteファイルをNSURLで指定し、initWithManagedObjectModelでモデルファイルとして生成します。

(NSString *)applicationDocumentsDirectory

アプリのデータ保存パスを返します。

(void)dealloc

忘れずにメモリを解放します。

Window-based Applicationではここまでです。 Navigation-based Applicationで作成した場合は、datetimeを値としたレコード処理がもれなくついてきます。 勉強には良さそうですが、いろいろと修正しなくちゃいけない気もしたり・・・ いや、まだ深く突っ込んでないから知りませんが(^^;)

次は、xcdatamodelを使ったモデラーの使い方をやってみます。

CoreDataの基礎 その1|CoreDataの基礎 その2|CoreDataの基礎 その3|CoreDataの基礎 その4