- (NSManagedObjectModel *)managedObjectModel
{
if (__managedObjectModel != nil) {
return __managedObjectModel;
}
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Fuga" withExtension:@"momd"];
__managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return __managedObjectModel;
}
Xcode3.x以前で作成したプロジェクトの場合、下記のようにmanagedObjectModelはmergedModelFromBundles:nilで取得している。
- (NSManagedObjectModel *)managedObjectModel
{
if (__managedObjectModel != nil) {
return __managedObjectModel;
}
managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
return __managedObjectModel;
}
mergedModelFromBundlesで取得した場合、アプリケーションバンドル内の新旧のモデルファイルを文字通りmergeして取得してしまう。
このままだとマイグレーションはおろか、通常のpersistentStoreCoordinatorインスタンスの取得さえもできず、アプリがクラッシュする。
このため、mergedModelFromBundlesで取得するようになっている場合、Xcode4.2で生成したときのように修正する必要がある。
※設定項目:
URLForResource : マッピングモデル名称
withExtension : "momd"固定
(例)
Hoge_v2.xcdatamodeld // マッピングモデル
Hoge.xcdatamodel // 旧データモデル
Hoge_v 2.xcdatamode // 新データモデル
URLForResourceには、"Hoge_v2"を設定する。
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Hoge_v2" withExtension:@"momd"];
__managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
※注意点
上記の場合、マッピングモデルのファイル名は、"Hoge_v2.xcdatamodeld"だが、withExtensionに"xcdatamodeld"を設定してはならない。
"momd"にすること。これはビルドして生成されるアプリケーションバンドルでは、マッピングモデルを"momd"というフォルダで管理していることによるもののようだ。
また、ビルド時はクリーンアップしてから行うこと。
参考記事:
http://cocoadays.blogspot.jp/2010/12/iosmac-coredata-2.html
http://bit.ly/Ke7beO
http://d.hatena.ne.jp/at_yasu/20100328/p1