Основные данные неразрешенная ошибка при сохранении - PullRequest
11 голосов
/ 18 августа 2011

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

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 объект (оба типа * 1012).*) для других контроллеров, всегда используя assign в свойстве и никогда retain.productList - это объект, который может содержать множество product объектов.

Я Я способен создавать новые объекты (NSManagedObject), но когда дело доходит до их удаления, я получаюошибка, упомянутая выше.При запуске приложения в симуляторе я внимательно слежу за файлом sqlite.после попытки удалить объект (код выше) я заметил, что файл .sqlite удален.

Я создал несколько приложений Core Data для iphone без проблем, но, похоже, у меня возникла проблема.я не верю, что делаю что-то необычное, но, возможно, мне не хватает мелких деталей, но я не знаю, что!

Почему мой файл .sqlite удаляется и приводит кэто сообщение об ошибке при сохранении?

Как найти более полезное сообщение об ошибке, чтобы я мог определить причину этой ошибки?

Ответы [ 2 ]

14 голосов
/ 18 августа 2011

Нашел проблему, но я не уверен, почему это исправляет:

Прежде чем удалить / удалить объект, я бы удалил связанное с ним изображение (хранится в каталоге документа).

Изображение по умолчанию не имеет значения (ноль), но я все равно попытался бы его удалить:

    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

если я вместо проверки удаленного изображения выполняю проверку на ноль, при удалении самого управляемого объекта я не получаю никакой ошибки:

    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

Я предполагаю, что попытка получить доступ к изображению продукта, когда оно равно нулю, делает его недействительным.

0 голосов
/ 07 января 2012

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