NILモデルエラーでnsperSistEntStoreCoordinatorを作成することはできません
-
26-10-2019 - |
質問
完全に実行されていたCoreData Datamodelファイルがあります。いくつかの特別な要件のためにi 削除 古いDataModelファイルと別のDataModelファイルを作成しました まったく同じエンティティ. 。がある エンティティに変更はありません 前のデータモデルから。私はこれをの一部にしました 別のバンドル そして、そのバンドルからそれを参照します。
ManagedObjectModelを作成するためのコード
if (managedObjectModel_ != nil) {
return managedObjectModel_;
}
NSBundle *newBundle = [NSBundle bundleWithURL:[[NSBundle mainBundle] URLForResource:@"dataBundle" withExtension:@"bundle"]];
NSString *modelPath = [newBundle pathForResource:@"DataHouse" ofType:@"momd"];
NSURL *modelURL = [NSURL fileURLWithPath:modelPath];
managedObjectModel_ = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return managedObjectModel_;
アプリはしばらくするまで正常に実行されており、突然(ランダムに)エラーが発生します
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Cannot create an NSPersistentStoreCoordinator with a nil model'
*** First throw call stack:`(0x62e052 0x26a9d0a 0xf6e86d 0x64fd 0x624e 0x381b 0x79c9b 0x65f2d 0x1881e0f 0x1882589 0x186ddfd 0x187c851 0x1827322 0x62fe72 0x160892d 0x1612827 0x1598fa7 0x159aea6 0x163437a 0x16341af 0x602966 0x602407 0x5657c0 0x564db4 0x564ccb 0x2791879 0x279193e 0x17e8a9b 0x28a2 0x2815)`
永続的なストアコーディネーターを作成するためのコード
if (persistentStoreCoordinator_ != nil) {
return persistentStoreCoordinator_;
}
NSURL *storeURL = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"DataHouse.sqlite"]];
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
NSError *error = nil;
persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return persistentStoreCoordinator_;
このエラーはランダムなポイントで発生しますが、アプリを実行するたびに非常に一貫性があります。私はこの時点で完全に混乱し、打たれています...フォーラムで同じ問題を見ましたが、私は特別なシナリオだと思います。私はかなり確信しています ModelPath 上記のコードスニペットに記載されている変数は、印刷するたびに問題なくなっています。
注:上記のコードスニペットは、AppDelegateクラスの一部ではありません。それらはすべてのcoredataメソッドを含む特別なクラスの一部です
解決 2
実際の問題は記憶の問題であることが判明しました。私はAppDelegateのコアデータオブジェクトを使用していなかったので、他のクラスでそれらを作成しています。しかし、私はこれらのオブジェクトをリリースしていません。そのため、大きな漏れがあり、アプリがクラッシュしました。コアデータオブジェクトをリリースしましたが、アプリは完全に正常に機能しています...
他のヒント
まず、managedobjectmodel_が有効であることを確認します。デバッガーを使用するか、そのようなメソッドを呼び出すことができます
NSLog(@"%@", [managedObjectModel_ entities]);
データモデルが問題ないことを確認するには。その呼び出しは、モデル内のすべてのエンティティの配列を表示するはずです。次に、永続的なストアパスが正しい場所を指していることを確認します。これを試して:
NSLog(@"%@", [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"DataHouse.sqlite"]);
最後に(それが私に起こったので何をする必要があると思いますか).sqliteファイルが保存されているディスクの場所に行きます:
~/Library/Application Support/iPhone Simulator/5.0/Applications/{your app id}/Documents
.sqliteファイルを削除して、コアデータが次にビルドするときに新鮮なデータを生成するようにします。
DataModel名がmodel.xcdatamodeidの場合。 urlforresourceパラメーターをappdelegate.hファイルのデータモデル名として置き換えるだけです。
nsurl *modelurl = [[nsbundle mainbundle] urlforresource:@"model" withextension:@"momd"];
参照用のコード以下。
(nsmanagedObjectModel *)ManagedObjectModel {
//アプリケーションのマネージドオブジェクトモデル。致命的なエラーです
アプリケーションがそのモデルを見つけてロードできないように。
if (_managedObjectModel != nil) {
return _managedObjectModel;
}
nsurl *modelurl = [[nsbundle mainbundle] urlforresource:@"model" withextension:@"momd"];
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return _managedObjectModel;
}