无法更新从未插入的对象



创建一个类别对象并保存:

    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

这样如何:

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

基本上检查对象之前是否被插入过,如果没有,插入它然后保存上下文

当你更新一个对象时,你不能使用insertNewObjectForEntityForName,你需要首先保存你的对象,然后调用类似

的东西
 [self.managedObjectContext refreshObject:_category mergeChanges:YES]

然后再次使用managedObjectContext保存。

这是直接SQL中"INSERT"one_answers"UPDATE"的区别

您的对象正在丢失managedObjectContext。使用

self.managedObjectContext

或重新获取

中的对象
[[FTAppDelegate sharedAppDelegate] managedObjectContext]

并编辑重新获取的对象,然后保存。

我有相同的错误,但不同的和罕见的情况,它发生在几乎100次尝试一次。

我有2个NSManagedObjects在核心数据模型:1 -铅2 - LeadAttirbuteLead与LeadAttribute有1-M关系

有一个表单,输入潜在客户并在提交潜在客户后刷新(创建新的潜在客户)表单。如果我继续提交线索,然后在一个阶段,[managedObjectContext save:&error];开始出现以下错误:

Domain=NSCocoaErrorDomain Code=134030 "操作无法完成。(Cocoa错误134030。)"用户信息= 0 x1f251740 {NSAffectedObjectsErrorKey = (" (entity: LeadInfoAttribute;Id: 0x1f2eb920;数据:{n attributeId = 0;n lead = nil;n optional = nil;n orderId = 0;n title = nil;n value = Bjjbjp;n})"), NSUnderlyingException=无法更新从未插入过的对象}

并且它继续给出相同的错误,直到我不终止并重新启动应用程序。在此错误发生后,我无法更新核心数据模型中的任何内容,所以我的问题是:

1-我们可以移除核心数据的故障状态吗?例如,在再次进行save调用之前,捕获并删除正在制造麻烦的对象。

2-这个问题可能的原因是什么?因为它非常罕见,不能每次都复制。

我刚刚遇到了这个问题,在我的情况下,问题如下:

  • 1)在上下文A中创建新的管理对象
  • 2)保存上下文A
  • 3)通过objecd从上下文B中检索该对象
  • 4)修改管理对象并保存上下文B

通常情况下,这不会是一个问题,但在这种情况下,上下文a是子上下文,因此不会保存到持久存储(只保存到父上下文,而不是上下文B)。因此,当从上下文B取回managedobject时,上下文没有这个对象。当发生更改时,上下文会尝试保存它们……这就是错误发生的时候。在某些情况下(如@Trausti Thor所提到的),refreshObject:mergeChanges:方法可以提供帮助(它将数据传递到另一个上下文)。

在你的情况下,我会检查是否:

1)管理对象context from [[FTAppDelegate sharedAppDelegate] managedObjectContext]总是返回相同的context

2)当您保存类别时,检查它是否真的保存到持久存储(self.category.objectID)。isTemporaryID == NO)

注意:第二点更重要,因为如果你仔细看,你的类别对象仍然有临时objectID,这意味着它没有被持久化。

我认为发生的是你没有得到正确的NSManagedObjectContext。

把它想象成一个会话。所以当你更新时,你没有得到正确的会话,所以你的对象不存在。

在做第二次保存之前,尝试在NSManagedObjectContext上找到你的对象。如果您需要进一步的帮助,请描述在创建和更新之间发生了什么。

获取错误的NSManagedObjectContext可能是由于AppDelegate上的错误代码或从主线程以外的另一个线程访问。

相关内容

  • 没有找到相关文章

最新更新