Неразрешенная ошибка ядра при сохранении

Я получаю сообщение об ошибке при сохранении моего основного контекста данных, вот журнал:

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);
    }