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