无法更新从未插入的对象

时间:2013-01-13 05:18:00

标签: ios core-data afincrementalstore

我创建了一个类别对象并将其保存:

    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 个答案:

答案 0 :(得分:4)

这样的事情怎么样:

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

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

答案 1 :(得分:1)

更新对象时,不能使用insertNewObjectForEntityForName,需要先保存对象,然后调用类似

的内容
 [self.managedObjectContext refreshObject:_category mergeChanges:YES]

然后再次使用managedObjectContext保存。

直接SQL的区别在于“INSERT”和“UPDATE”。

答案 2 :(得分:1)

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

self.managedObjectContext

或在

中重新获取对象
[[FTAppDelegate sharedAppDelegate] managedObjectContext]

并编辑refetch对象,然后保存。

答案 3 :(得分:1)

我有相同的错误但不同且罕见的情况,它在近100次尝试中发生一次。在下面找到我的问题:

我在核心数据模型中有2个NSManagedObjects: 1-铅 2- LeadAttirbute Lead与LeadAttribute有1-M的关系。

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

Domain = NSCocoaErrorDomain Code = 134030“操作无法完成。(Cocoa error 134030.)”UserInfo = 0x1f251740 {NSAffectedObjectsErrorKey =(     “(entity:LeadInfoAttribute; id:0x1f2eb920; data:{\ n attributeId = 0; \ n lead = nil; \ n optional = nil; \ n orderId = 0; \ n title = nil; \ n value = Bjjbjp; \ N})” ), NSUnderlyingException =无法更新从未插入的对象。}

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

1-我们可以删除核心数据的故障状态吗?即在再次进行保存呼叫之前捕获并删除造成问题的对象。

2-这个问题的可能原因是什么?由于它非常罕见,每次都无法重现。

答案 4 :(得分:1)

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

  • 1)在上下文A中创建新的托管对象
  • 2)保存上下文A
  • 3)通过上下文B中的objectID检索此对象
  • 4)对托管对象进行更改并保存上下文B

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

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

1)来自[[FTAppDelegate sharedAppDelegate] managedObjectContext]的托管对象上下文始终返回相同的上下文

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

注意: 第二点更重要,因为如果你仔细观察,你的类别对象仍然有临时的objectID,这意味着它不会持久存在。

答案 5 :(得分:0)

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

将其视为会话。因此,当您更新时,您没有获得正确的会话,因此您的对象不存在。

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

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