2010年6月12日土曜日

Core Data デフォルトのデータを用意する

サンプルCoreDataBooksは初期起動時にいくつかの本の情報が入っています。あんな感じで、デフォルトのデータを提供したいのです。

CoreDataBooksはどうやってDocumentsディレクトリにCoreDataBooks.sqliteをコピーしているのかなーと「プロジェクト情報」を見たりなんなりで30分。結局ソースコードでコピーしている事が判明。最初に気づけと。

以下、手順です。

適当なプロジェクト、適当なデフォルトデータを作成する


ここでは、「Navigation-based Application」テンプレート、「Use Core Data for storage」付きでプロジェクトを作成。
アプリケーション起動後、+ボタンを連打し適当なデータを作成しました。

デフォルトデータをプロジェクトに追加する


さっき作った適当データは

/Users/ユーザ名/Library/Application Support/iPhone Simulator/バージョン/Applications/アプリ/Documents

あたりにあるので、それをXcodeのResourceグループあたりに放り込んでやります。


これでアプリケーションバンドルにデータが含まれるようになります。

データをコピーするようにコードを修正


AppDelegateのpersistentStoreCoordinator()というメソッドの中でデータをロードしているはずです。
そこを書き換えます。

変更前。
NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"CoreDataTest.sqlite"]];

変更後。
NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"CoreDataTest.sqlite"];
NSFileManager *fileManager = [NSFileManager defaultManager];
// データがなければデフォルトデータをコピーする
if (![fileManager fileExistsAtPath:storePath]) {
    NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"CoreDataTest" ofType:@"sqlite"];
    if (defaultStorePath) {
        [fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL];
    }
}
NSURL *storeUrl = [NSURL fileURLWithPath:storePath];

これでデフォルトデータを提供できるようになりました。

0 件のコメント:

コメントを投稿