Неразрешенная ошибка ядра при сохранении
Я получаю сообщение об ошибке при сохранении моего основного контекста данных, вот журнал:
Unresolved error Error Domain=NSCocoaErrorDomain Code=134030 "The operation couldn’t be completed. (Cocoa error 134030.)" UserInfo=0x1937a0 {NSAffectedStoresErrorKey=(
"<NSSQLCore: 0x156410>"
), NSUnderlyingError=0x181a60 "The operation couldn’t be completed. (Cocoa error 4.)", NSFilePath=/var/mobile/Applications/appid/Documents/appname.sqlite}, {
NSAffectedStoresErrorKey = (
"<NSSQLCore: 0x156410>"
);
NSFilePath = "/var/mobile/Applications/appid/Documents/appname.sqlite";
NSUnderlyingError = "Error Domain=NSCocoaErrorDomain Code=4 \"The operation couldn\U2019t be completed. (Cocoa error 4.)\" UserInfo=0x181a30 {NSUnderlyingError=0x108ab0 \"The operation couldn\U2019t be completed. No such file or directory\"}";
}
Я получаю эту ошибку после удаления и удаления объекта:
[productList removeMProductObject:product];
[[delegate managedObjectContext] deleteObject:product];
[delegate saveContext];
Я также отметил, что также получаю ошибку для следующих сценариев (отладки):
1.
[productList removeMProductObject:product];
[delegate saveContext];
2.
[[delegate managedObjectContext] deleteObject:product];
[delegate saveContext];
3.
[[delegate managedObjectContext] deleteObject:product];
[productList removeMProductObject:product];
[delegate saveContext];
4.
[[delegate managedObjectContext] deleteObject:product];
[delegate saveContext];//error
[productList removeMProductObject:product];
[delegate saveContext];
5.
[productList removeMProductObject:product];
[delegate saveContext];//error
[[delegate managedObjectContext] deleteObject:product];
[delegate saveContext];
Иногда я могу обойти либо объект productList
, либо product
(оба типа NSManagedObject
) для других контроллеров, всегда используя assign
в свойстве и никогда retain
. productList
- это объект, который может содержать много объектов product
.
I am способен создавать новые объекты (NSManagedObject
), но когда дело доходит до их удаления, я получаю упомянутую выше ошибку. При запуске приложения в симуляторе я внимательно слежу за файлом sqlite. после попытки удаления объекта (код выше), я замечаю, что файл .sqlite удален.
Я создал несколько приложений iphone Core Data без проблем, но у меня, похоже, проблема. я не верю, что я делаю что-то необычное, но, возможно, мне не хватает маленькой детали, но я не знаю, что!
Почему мой .sqlite файл удаляется и в результате появляется это сообщение об ошибке при сохранении?
Как я могу найти более полезное сообщение об ошибке, чтобы определить причину этой ошибки?
Ответы
Ответ 1
Нашел проблему, но я не уверен, почему она ее исправляет:
Прежде чем я удалю/удалю объект, я удалю связанное с ним изображение (сохраненное в каталоге документа).
Изображение по умолчанию не имеет значения (ноль), но я все равно попытаюсь его удалить:
NSError *deleteError = nil;
[[NSFileManager defaultManager] removeItemAtPath:[DOCUMENTS_DIRECTORY stringByAppendingPathComponent:product.mPictureName] error:&deleteError];
#ifdef DEBUG_MODE
if(deleteError) {
NSLog(@"Error deleting image: %@", [deleteError description]);
}
else {
NSLog(@"Image %@ deleted.", product.mPictureName);
}
#endif
Если я вместо этого сделаю проверку nil, прежде чем пытаться удалить это изображение, я не получаю ошибку, когда я удаляю сам управляемый объект:
NSString *imageName = product.mPictureName;
if(imageName) {
NSError *deleteError = nil;
[[NSFileManager defaultManager] removeItemAtPath:[DOCUMENTS_DIRECTORY stringByAppendingPathComponent:imageName] error:&deleteError];
#ifdef DEBUG_MODE
if(deleteError) {
NSLog(@"Error deleting image: %@", [deleteError description]);
}
else {
NSLog(@"Image %@ deleted.", imageName);
}
#endif
}
...
//delete NSManagedObject and save
Я предполагаю, что попытка получить доступ к изображению продукта, когда он равен нулю, делает все недействительным.
Ответ 2
У меня была аналогичная проблема, которая стоит сообщать о любом бедном shmo, который попадает в эту проблему. В моем случае у меня был контроллер табличного представления, который обрабатывал удаления строк, удаляя соответствующие данные из модели данных. Когда я использовал метод ## ObjectName ## Object, который был удален с помощью автоматически созданного подкласса NSManagedObject, я получаю ошибку, аналогичную той, которую вы сообщили.
Когда я вместо этого использовал NSManagedObjectContext: deleteObject У меня не было проблемы с сохранением контекста. Но я заметил, что исключение выбрасывается без указания причины с консоли.
Оказывается, метод tableView canEditRowAtIndexPath: вызывается для строки, соответствующей вновь удаленному объекту. Было ясно, что количество строк должно быть обновлено до того, как ОС вызовет этот метод. Но мне все равно. Я просто проверяю, можно ли индексировать размер моего массива управляемых объектов по строке indexPath.
if([managedObjSet.objects count] > indexPath.row) {
ManagedObject* obj = [managedObjectArray objectAtIndex:indexPath.row];
return ([obj.anotherManagedObjSet count] ==0);
}