Невозможно обновить объект, который никогда не был вставлен
Я создаю объект категории и сохраняю его:
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 или доступом из другого потока, отличного от основного потока.