Невозможно обновить объект, который никогда не был вставлен

Я создаю объект категории и сохраняю его:

    NSManagedObjectContext *managedObjectContext = [[FTAppDelegate sharedAppDelegate] managedObjectContext];

    _category = (Category *)[NSEntityDescription
                             insertNewObjectForEntityForName:@"Category"
                             inManagedObjectContext:managedObjectContext];

    NSError *error = nil;
    [managedObjectContext save:&error];
    if (error) {
        NSLog(@"error saving: %@",error);
    }

затем отредактируйте имя объекта категории и сохраните снова.

    _category.name = _nameTextField.text;

    NSManagedObjectContext *managedObjectContext = [[FTAppDelegate sharedAppDelegate] managedObjectContext];

    NSError *error = nil;
    [managedObjectContext save:&error];
    if (error) {
        NSLog(@"error saving: %@",error);
    }

и получите эту ошибку:

 2013-01-12 17:53:11.862 instacat[7000:907] Unresolved error Error Domain=NSCocoaErrorDomain Code=134030 "The operation couldn’t be completed. (Cocoa error 134030.)" UserInfo=0x2027b300 {NSAffectedObjectsErrorKey=(
"<Category: 0x1ed43cf0> (entity: Category; id: 0x1ed52970 <x-coredata://68E5D7B6-D461-4962-BC07-855349DB3263-7000-00000141BAB4C399/Category/tE8AB2F2E-C14C-4E93-8343-CC245B7726622> ; data: {\n    categoryId = nil;\n    isPrivate = 0;\n    name = techies;\n    users =     (\n    );\n})"
), NSUnderlyingException=Cannot update object that was never inserted.}, {
    NSAffectedObjectsErrorKey =     (
         "<Category: 0x1ed43cf0> (entity: Category; id: 0x1ed52970 <x-coredata://68E5D7B6-D461-4962-BC07-855349DB3263-7000-00000141BAB4C399/Category/tE8AB2F2E-C14C-4E93-8343-CC245B7726622> ; data: {\n    categoryId = nil;\n    isPrivate = 0;\n    name = techies;\n    users =     (\n    );\n})"
    );
     NSUnderlyingException = "Cannot update object that was never inserted.";
}

Спасибо за ваше время и внимание.

Я использую AFIncrementalStore.

6 ответов

Как насчет чего-то вроде этого:

self.category.name = self.nameTextField.text;

NSManagedObjectContext *managedObjectContext = [[FTAppDelegate sharedAppDelegate] managedObjectContext];

if(![self.category isInserted])
{
    [managedObjectContext insertObject:self.category];
}

NSError *error = nil;
[managedObjectContext save:&error];
if (error) {
    NSLog(@"error saving: %@",error);
}

В основном проверьте объект, был ли он вставлен до этого, если нет, вставьте его, а затем сохраните контекст.

У меня та же ошибка, но другой и редкий сценарий, это происходит один раз в почти 100 попыток. Найдите мою проблему ниже:

У меня есть 2 NSManagedObjects в базовой модели данных: 1- Lead 2- LeadAttirbute Lead имеет отношение 1-M с LeadAttribute.

Существует форма, которая вводит информацию о потенциальной возможности и обновляет (создает новую потенциальную информацию) форму после отправки потенциальной возможности. Если я продолжу подавать заявки, то на этапе [managedObjectContext save:&error]; начинает давать ниже ошибку:

Domain = NSCocoaErrorDomain Code = 134030 "Операция не может быть завершена. (Ошибка какао 134030.)" UserInfo=0x1f251740 {NSActedObjectsErrorKey=( " (entity: LeadInfoAttribute; id: 0x1f2eb920; данные: {\ attribute_Id = 0;\n lead = nil;\n необязательный = nil; \ n orderId = 0; \ n title = nil; \ n value = Bjjbjp; \ n}) "), NSUnderlyingException = Невозможно обновить объект, который никогда не был вставлен.}

И он продолжает выдавать ту же ошибку, пока я не завершу и не перезапущу приложение. Я не могу ничего обновить в базовой модели данных после возникновения этой ошибки, поэтому мои вопросы:

1- Можем ли мы удалить состояние ошибки данных ядра? т.е. захватить и удалить объект, который создает проблему, перед повторным вызовом сохранения.

2- Каковы могут быть возможные причины этой проблемы? Так как это очень редко и не может воспроизвести это каждый раз.

Ваш объект теряет управляемый объект. Либо использовать

self.managedObjectContext

или повторно получить объект в

[[FTAppDelegate sharedAppDelegate] managedObjectContext]

и отредактируйте повторно полученный объект и затем сохраните его.

Когда вы обновляете объект, вы не можете использовать insertNewObjectForEntityForName, вам нужно сначала сохранить ваш объект, а затем вызвать что-то вроде

 [self.managedObjectContext refreshObject:_category mergeChanges:YES]

Затем снова используйте сохраненный файл managedObjectContext save.

Это разница в прямом SQL как "INSERT" и "UPDATE".

Я только столкнулся с этой проблемой, и в моем случае проблема была следующей:

  • 1) создать новый управляемый объект в контексте A
  • 2) сохранить контекст А
  • 3) получить этот объект по objectID из контекста B
  • 4) внести изменения в управляемый объект и сохранить контекст B

Обычно это не было бы проблемой, но в этом случае контекст A является дочерним контекстом и поэтому не сохраняется в постоянное хранилище (только в родительский контекст, который не является контекстом B). Поэтому, когда выборка для управляемого объекта выполняется из контекста B, контекст не имеет этого объекта. Когда изменения сделаны, контекст пытается сохранить их в любом случае... и это когда эта ошибка происходит. В некоторых случаях (как упомянул @Trausti Thor) может помочь метод refreshObject:mergeChanges: (он передает данные в другой контекст).

В вашем случае я проверю, если:

1) контекст управляемого объекта из [[FTAppDelegate sharedAppDelegate] managedObjectContext] всегда возвращает один и тот же контекст

2) при сохранении категории проверьте, действительно ли она была сохранена в постоянном хранилище (self.category.objectID.isTevenID == НЕТ)

ПРИМЕЧАНИЕ. Второй момент важнее, потому что если вы внимательно посмотрите, у вашего объекта категории все еще есть временный идентификатор объекта, то есть он не сохраняется.

Я думаю, что это происходит из-за того, что вы не получаете правильный NSManagedObjectContext.

Думайте об этом как о сеансе. Поэтому, когда вы обновляетесь, вы не получаете нужную сессию, и поэтому ваш объект там не существует.

Перед вторым сохранением попробуйте найти свой объект в этом NSManagedObjectContext. Если вам нужна дополнительная помощь, пожалуйста, опишите, что происходит между созданием и обновлением.

Получение неправильного NSManagedObjectContext может быть связано с неправильным кодом в AppDelegate или доступом из другого потока, отличного от основного потока.

Другие вопросы по тегам