CoreDataを使う1。基本的なオブジェクト。
iphoneアプリでデータの永続化にCoreDataの使用について、ちょっと整理していきましょ。
(これまで使ってきたDB接続のインターフェイスとは考え方が違うのでちょっとわかりにくかったこともあるので。)
使用している開発環境は、「XCode 3.2.1」です。
アプリケーションの作成
プロジェクトのタイプとして「navigation-based Application」を選択、「Use Core Data for storage」をチェックしてプロジェクトを作成するとCore Dataを使うためのテンプレートソースなどを作成してくれます。
今回をそれを利用します。
基本的なオブジェクト
「Core Data」を使用するさいの基本となるオブジェクトを生成するコードが、アプリケーションのデレゲートクラスに作られます。
このクラスのヘッダーファイルは以下のようなものになりますが。
@interface NoteAppDelegate : NSObject <UIApplicationDelegate> { NSManagedObjectModel *managedObjectModel; NSManagedObjectContext *managedObjectContext; NSPersistentStoreCoordinator *persistentStoreCoordinator; UIWindow *window; UINavigationController *navigationController; } @property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel; @property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext; @property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator; @property (nonatomic, retain) IBOutlet UIWindow *window; @property (nonatomic, retain) IBOutlet UINavigationController *navigationController; - (NSString *)applicationDocumentsDirectory; @end
「Core Data」に関係あるのは、以下の属性です。
NSManagedObjectModel *managedObjectModel; NSManagedObjectContext *managedObjectContext; NSPersistentStoreCoordinator *persistentStoreCoordinator;
NSManagedObjectModel
これは、各EntityやEntity同士の関連を保持、提供するためのモデルオブジェクトです。今回のプロジェクトのテンプレートでは、この定義を「xdatamodel」という拡張子のモデルファイルから読み込むようになっています。
以下は、その自動生成された実装部分です。
/** Returns the managed object model for the application. If the model doesn't already exist, it is created by merging all of the models found in the application bundle. */ - (NSManagedObjectModel *)managedObjectModel { if (managedObjectModel != nil) { return managedObjectModel; } managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain]; return managedObjectModel; }
NSPersistentStoreCoordinator
これは、永続化オブジェクトです。上記のモデルと実際のStorage(SQLiteなどのStorage)を関連づけて永続化を行う機能を実現します。
多分XMLなど他の形式をStorageにすることも可能なのでしょうけど、今回のプロジェクトのテンプレートでは、SQLiteが使われるようになっています。多分これが、標準的でベターな方法なのでしょう。
以下が実装部分です。
「addPersistentStoreWithType:configuration:URL:options:error」メッセージにおいて データベースファイルとして、アプリケーションディレクトリのトップのデータベースファイルを具体的なStorage、タイプをNSSQLiteSoterTypeが指定されています。
/** 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 = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"Note.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; }
NSManagedObjectContext
データベースから取得したデータオブジェクトを管理したりするメモリ内データベースのようなもの。
以下、自動生成された実装部分です。上記の永続化オブジェクト(NSPersistentStoreCoordinator)との関連づけが行われます。
/** 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; }
とりあえず、準備部分をみたところで、続きはまた今度。