[14647:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Can't merge models with two different entities named 'Customer'' *** Call stack at first throw: ( 0 CoreFoundation 0x0150dbe9 __exceptionPreprocess + 185 1 libobjc.A.dylib 0x016625c2 objc_exception_throw + 47 2 CoreData 0x0037a9b9 +[NSManagedObjectModel modelByMergingModels:] + 3865 3 CoreData 0x00378fcb +[NSManagedObjectModel mergedModelFromBundles:] + 507 :
調べてみると次の記事が見つかった。
iPhone Development: Core Data Migration Problems?
どうも下記のコードが問題のようだ。
- (NSManagedObjectModel *)managedObjectModel
{
if (managedObjectModel_ != nil) {
returnmanagedObjectModel_;
}
managedObjectModel_ = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
returnmanagedObjectModel_;
}上記の -[NSManagedObjectModel mergedModelFromBundles:] が新旧両方のモデルを一緒に読み込もう(merge)としてエラーになっているようだ。実際にアプリケーションパッケージの中を覗いてみると次のようになっていた。*.momd という名のフォルダが作られてその中に新旧モデルファイル(*.mom)とバージョン管理用のファイルが入っている。-[NSManagedObjectModel mergedModelFromBundles:] はアプリケーションバンドル内のモデルファイル(*.mom)をバージョン管理を無視して読み込む(merge)しようとするようだ。なおマイグレーションを行わない初期の状態ではこのフォルダは存在せず、最初のバージョンのモデルファイル(*.mom)が一つあるだけ。
解決方法はモデルファイルの検索を NSManagedObjectModel に任せないで *.momd フォルダの位置を明示的に指定すれば良い。こんな感じ。
- (NSManagedObjectModel *)managedObjectModel
{
if (managedObjectModel_ != nil) {
returnmanagedObjectModel_;
}
NSString *path = [[NSBundle mainBundle] pathForResource:@"hairConcierge" ofType:@"momd"];
NSURL *url = [NSURLfileURLWithPath:path];
managedObjectModel_ = [[NSManagedObjectModelalloc] initWithContentsOfURL:url];
returnmanagedObjectModel_;
}上記はブログで紹介されていたのと同等のコードだが、少し改良して momdフォルダ名を書かないコードにしてみた(必要だったので)。こんな感じ。- (NSManagedObjectModel *)managedObjectModel
{
if (managedObjectModel_ != nil) {
returnmanagedObjectModel_;
}
NSArray* paths = [[NSBundlemainBundle] pathsForResourcesOfType:@"momd" inDirectory:nil];
NSURL *url = [NSURLfileURLWithPath:[paths objectAtIndex:0]];
managedObjectModel_ = [[NSManagedObjectModelalloc] initWithContentsOfURL:url];
returnmanagedObjectModel_;
}



Responses
Leave a Response