Невозможно получить предыдущие данные с EncryptedCoreData

После перезапуска приложения данные из основных данных не возвращаются должным образом. И получить запрос на получение конкретной записи также не удается. FetchRequestController не получает никаких записей после перезапуска приложения.

Я использую зашифрованные данные ядра для защиты данных в моем проекте. Я могу анализировать и сохранять данные в 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 код такой же, как этот

Когда я печатаю объект перед закрытием приложения, он печатает

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 переопределяет поведение обработки ошибок, чтобы беззвучно удалить объект с идентификатором '0x7feb02de5c10 ' и заменить nil/0 для всех значений свойств вместо броска

Если я использую NSSQLiteStoreType вместо EncryptedStoreType все отлично работает Можете ли вы указать мне, что я делаю не так?

Потому что из-за вышеуказанной проблемы записи базы данных добавляются несколько раз, и запрос на выборку не может получить управляемый объект с uniqueId.

1 ответ

ТЛ; др

Не используйте ключевые слова SQLite в вашей модели (свойства, отношения, сущности и т. Д.).


Обычно с 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это также ключевое слово. Попробуйте убрать и проверить.

Примечание. Даже после переименования этого свойства из модели мне пришлось повторно удалить и установить приложение, что не доставляет особых хлопот, поскольку оно еще не опубликовано.

Другие вопросы по тегам