Я стучу головой о стену здесь, я использую Core Data для SQLLite DB, и я могу успешно сохранить базу данных (я проверил содержимое в автономном браузере SQLLite), но после сохранения первого запроса, который я пытаюсь запустить, возвращается с ошибкой, описанной ниже, и я не могу найти полезную информацию в Интернете относительно этой конкретной ошибки:
Основные данные: ошибка: -executeRequest: обнаруженное исключение = база данных выглядит коррумпированной. (недопустимый первичный ключ) с userInfo = { NSFilePath = "/Пользователи/пользователь/Library/Поддержка приложений /iPhone Simulator/7.0.3/Documents/db.sqlite";
Вопрос в том, что вызывает эту ошибку, поскольку я не могу найти никакой информации, относящейся к ней.
Для небольшого фона, это моя настройка, пожалуйста, предположите, что у меня есть веские причины для дизайна, который был сделан, и не дают ответа "Измените свой дизайн", если вы не видите что-то принципиально нарушенное сам образец.
У меня есть 3 контекста управляемых объектов, все из них - NSPrivateQueueConcurrencyType, первый (A) прикреплен к координатору постоянных хранилищ, второй (B) имеет A, заданный как его родительский контекст, а третий (C) имеет B установить как родительский контекст - цепочку. Причиной этого является то, что C является записываемым контекстом, извлекает данные из сетевого источника и синхронизирует его и сохраняет его, B - это контекст, разделяемый элементами пользовательского интерфейса, и я хочу, чтобы он был отзывчивым, наконец A - фоновый контекст, разработанный выгрузить любые задержки для сохранения на диск из контекста B и C
PSC < -A < -B < -C
Если я выберу последний шаг (Saving A to PSC), то приложение отлично работает, сохраняя все в памяти и запрашивая контексты в памяти. Сбой возникает только после добавления шага сохранения и только при первом запросе, выполняемом с БД после этого сохранения. И мое сохранение, и мое выполнение выборки завернуты в executeBlock:
Вот последнее сохранение:
- (void)deepSave
{
// Save to the Save Context which happens in memory, so the actual write to disk operation occurs on background thread
// Expects to be called with performBlock
NSError *error = nil;
[super save:&error];
NSAssert(!error, error.localizedDescription);
// Trigger the save context to save to disk, operation will be queued and free up read only context
NSManagedObjectContext *saveContext = self.parentContext;
[saveContext performBlock:^{
NSError *error = nil;
[saveContext save:&error];
NSAssert(!error, error.localizedDescription);
}];
}
И вот стек выполнения (в потоке NSManagedObjectContext Queue)
#0 0x0079588a in objc_exception_throw ()
#1 0x079d98e7 in -[NSSQLiteConnection handleCorruptedDB:] ()
#2 0x078d9b8d in -[NSSQLiteConnection fetchResultSet:usingFetchPlan:] ()
#3 0x078e24a5 in newFetchedRowsForFetchPlan_MT ()
#4 0x078cd48e in -[NSSQLCore newRowsForFetchPlan:] ()
#5 0x078cca8d in -[NSSQLCore objectsForFetchRequest:inContext:] ()
#6 0x078cc53f in -[NSSQLCore executeRequest:withContext:error:] ()
#7 0x078cbf62 in -[NSPersistentStoreCoordinator executeRequest:withContext:error:] ()
#8 0x078c96c6 in -[NSManagedObjectContext executeFetchRequest:error:] ()
#9 0x0791e526 in -[NSManagedObjectContext(_NestedContextSupport) _parentObjectsForFetchRequest:inContext:error:] ()
#10 0x0799c1f4 in __82-[NSManagedObjectContext(_NestedContextSupport) executeRequest:withContext:error:]_block_invoke ()
#11 0x0791e321 in internalBlockToNSManagedObjectContextPerform ()
#12 0x013c34b0 in _dispatch_client_callout ()
#13 0x013b0778 in _dispatch_barrier_sync_f_invoke ()
#14 0x013b0422 in dispatch_barrier_sync_f ()
#15 0x0791e2a2 in _perform ()
#16 0x0791e14e in -[NSManagedObjectContext(_NestedContextSupport) executeRequest:withContext:error:] ()
#17 0x078c96c6 in -[NSManagedObjectContext executeFetchRequest:error:] ()
#18 0x0791e526 in -[NSManagedObjectContext(_NestedContextSupport) _parentObjectsForFetchRequest:inContext:error:] ()
#19 0x0799c1f4 in __82-[NSManagedObjectContext(_NestedContextSupport) executeRequest:withContext:error:]_block_invoke ()
#20 0x0791e321 in internalBlockToNSManagedObjectContextPerform ()
#21 0x013c34b0 in _dispatch_client_callout ()
#22 0x013b0778 in _dispatch_barrier_sync_f_invoke ()
#23 0x013b0422 in dispatch_barrier_sync_f ()
#24 0x0791e2a2 in _perform ()
#25 0x0791e14e in -[NSManagedObjectContext(_NestedContextSupport) executeRequest:withContext:error:] ()
#26 0x078c96c6 in -[NSManagedObjectContext executeFetchRequest:error:] ()