无法使用EncryptedCoreData检索以前的数据

时间:2016-01-24 19:34:43

标签: ios core-data encryption encrypted-core-data-sql

重新启动应用后,核心数据中的数据无法正常返回。获取特定记录的获取请求也会失败。重新启动应用后,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();
}

代码可以正常运行。我的persistentStoreCoordinatormanagedObjectContext代码与this

相同

当我在关闭应用程序之前打印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的托管对象。

1 个答案:

答案 0 :(得分:0)

TL;博士

不要在模型上使用SQLite Keywords(属性,关系,实体等)。

通常使用CoreData可以安全地使用SQLite保留关键字,但使用EncryptedCoreData时显然不是这样。

#232问题也解释了这一点。

在我的项目中,我from作为我的某个模特的属性,而这个单一属性是罪魁祸首。

我可以从该代码中看到:

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,这也是关键字。尝试删除并检查。

注意:即使重新命名模型中的该属性,我也必须再次卸载并安装应用程序,因为它还没有发布,所以对我来说没什么麻烦。