この場合は、アプリのリリース当初からCore Dataにデータをバンドルしておくのが望ましい。
手順としては下記のようになる。
1. iPhoneシミュレータでCore Dataにデータをインポートするアプリを実行し、Mac上にCore Dataファイルを作成する。仮に、作成されたファイル名を「DataModel.sqlite」、データモデルを「DataModel.xcdatamodeld」とする。
2. Xcodeを起動して新しいプロジェクトに、上記1.で作成したsqliteファイルをコピーする。
ファイルは下記記事で示すフォルダにある。
http://iphone-app-developer.seesaa.net/article/301338657.html
3. 上記2.でコピーしたファイルをリネームする。
変更前:DataModel.sqlite
変更後:DefaultData.sqlite
4. 上記2.で新たに作ったプロジェクト上に上記1.で作成したデータモデルをコピーする。
5. 上記2.で新たに作ったプロジェクト上の、もとからあったデータモデル(hoge.xcdatamodeld)を削除し、上記4.でコピーしたデータモデルの名前をもとからあったデータモデルにリネームする。
変更前:DataModel.xcdatamodeld
変更後:hoge.xcdatamodeld
6. AppDelegete.mを修正する。
- (NSManagedObjectModel *)managedObjectModel {
if (managedObjectModel != nil) {
return managedObjectModel;
}
managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];
return managedObjectModel;
}
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"hoge.sqlite"];
NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:storePath]) {
NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"DefaultData" ofType:@"sqlite"];
if (defaultStorePath) {
[fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL];
}
}
NSURL *storeUrl = [NSURL fileURLWithPath:storePath];
NSError *error = nil;
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error]) {
abort();
}
return persistentStoreCoordinator;
}
- (NSString *)applicationDocumentsDirectory {
return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}
上記コードでは、作成するCore Dataファイルはsqliteで「DataModel.sqlite」としているが、「DefaultData.sqlite」があれば、このファイルを読む込む処理を記述している。
また、managedObjectModelメソッド、applicationDocumentsDirectoryメソッドで、データモデルおよびファイルパスを変更する必要がある。
2014年9月4日追記:
上記の手法でデータモデルやsqliteファイルを外部からインポートすると、実行時に下記のエラーによりアプリがクラッシュしてしまう。
最新の方法では、データモデルをバージョン管理する手法による操作が必要となる。
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Cannot create an NSPersistentStoreCoordinator with a nil model'
アプリのリリース時からCore Dataにデータをバンドルしておく方法 [最新版]
http://iphone-app-developer.seesaa.net/article/404883348.html