1

アプリの再起動後、コアデータからのデータが正しく返されません。また、特定のレコードを取得するためのフェッチ リクエストも失敗します。アプリが再起動されると、FetchRequestController はレコードを取得しません。

プロジェクトのデータを保護するためにencrypted-core-dataを使用しています。データを解析して managedObjectContext に保存できます。私のコードは次のようになります

for (NSDictionary *data in categories) {
    //Use MagicRecord api to get a record
    CMCategories *Obj = [CMCategories MR_findFirstByAttribute:@"uniqueId" 
                    withValue:[data valueForKey:@"id"] 
                    inContext:managedObjectContext];
    if (!Obj) {
        Obj = [CMCategories MR_createEntityInContext:managedObjectContext];
    }
    Obj.name = [data valueForKey:@"CategoryName"];
    Obj.language = [data valueForKey:@"LanguageCode"];
    Obj.uniqueId = [data valueForKey:@"id"];

}
NSError *error = nil;
if (![_managedObjectContext save:&error]) {
    NSLog(@"Error saving context: %@\n%@", [error localizedDescription], [error userInfo]);
    abort();
}

コードはエラーなしで機能します。私persistentStoreCoordinatorのコードはこれmanagedObjectContextと同じです

アプリを閉じる前にobjを印刷すると、印刷されます

2016-01-24 23:59:11.806 Chare Dev[10556:158617] <CMCategories: 0x7feb00d24a90> (entity: CMCategories; id: 0x7feb02ef5890 <x-coredata://B947ACD3-E248-4D4F-B81E-236E100BB34D/CMCategories/p5> ; data: {
    channels =     (
    );
    language = en;
    name = Professional;
    order = 0;
    uniqueId = 15;
})

しかし、アプリの再起動後、すべてのオブジェクトを取得して印刷すると、次のように印刷されます

2016-01-24 23:59:11.795 Chare Dev[10556:158617] <CMCategories: 0x7feb02de4aa0> (entity: CMCategories; id: 0x7feb02de5c10 <x-coredata://B947ACD3-E248-4D4F-B81E-236E100BB34D/CMCategories/p2> ; data: {
    channels = "<relationship fault: 0x7feb02922450 'channels'>";
    language = nil;
    name = nil;
    order = nil;
    uniqueId = nil;
})

プロパティを取得しようとすると NSString *string = obj.uniqueId

2016-01-24 23:59:11.795 Chare Dev[10556:158617] CoreData: 警告: NSManagedObjectContext デリゲートが障害処理動作をオーバーライドして、ID '0x7feb02de5c10' のオブジェクトをサイレント モードで削除し、スローする代わりにすべてのプロパティ値を nil/0 に置き換えました

NSSQLiteStoreType代わりに使用すると、EncryptedStoreTypeすべて正常に動作します。私が間違っていることを教えてもらえますか?

上記の問題により、データベース レコードが複数回追加され、フェッチ リクエストが uniqueId を持つ管理対象オブジェクトのフェッチに失敗するためです。

4

1 に答える 1

0

tl;dr

モデル (プロパティ、関係、エンティティなど) でSQLite キーワードを使用しないでください。


通常、 CoreData では SQLite の予約済みキーワードを安全に使用できますが、EncryptedCoreDataを使用する場合はそうではないようです。

この#232号でも説明されています。

私のプロジェクトfromでは、モデルの 1 つのプロパティとして持っていましたが、この 1 つのプロパティが原因でした。

私はそのコードから見ることができます:

2016-01-24 23:59:11.806 Chare Dev[10556:158617] <CMCategories: 0x7feb00d24a90> (entity: CMCategories; id: 0x7feb02ef5890 <x-coredata://B947ACD3-E248-4D4F-B81E-236E100BB34D/CMCategories/p5> ; data: {
    channels =     (
    );
    language = en;
    name = Professional;
    order = 0;
    uniqueId = 15;
})

を使用しorderていますが、これもキーワードです。削除して確認してみてください。

注:モデルからそのプロパティの名前を変更した後でも、アプリをアンインストールして再度インストールする必要がありましたが、まだ公開されていないため、それほど面倒ではありません.

于 2016-07-26T11:54:44.083 に答える