11

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

    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。

4

6 回答 6

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

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

于 2013-04-04T10:24:43.747 回答
1

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

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

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

Domain=NSCocoaErrorDomain Code=134030 "操作无法完成。(Cocoa 错误 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-这个问题的可能原因是什么?由于它非常罕见,并且无法每次都复制。

于 2013-10-07T20:29:41.123 回答
1

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

self.managedObjectContext

或重新获取对象

[[FTAppDelegate sharedAppDelegate] managedObjectContext]

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

于 2013-04-24T09:08:32.380 回答
1

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

 [self.managedObjectContext refreshObject:_category mergeChanges:YES]

然后再次使用 managedObjectContext 保存。

这是直接 SQL 作为“INSERT”和“UPDATE”的区别。

于 2013-01-29T13:11:49.257 回答
1

我刚刚遇到了这个问题,就我而言,问题如下:

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

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

在您的情况下,我将检查是否:

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

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

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

于 2015-08-24T14:04:18.400 回答
0

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

把它想象成一个会话。因此,当您更新时,您没有获得正确的会话,因此您的对象不存在。

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

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

于 2013-01-30T10:04:51.323 回答