创建一个类别对象并保存:
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上的错误代码或从主线程以外的另一个线程访问。