質問

完全に実行されていた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;

}

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top