如何在代码中复制 Core Data 托管对象
Posted
技术标签:
【中文标题】如何在代码中复制 Core Data 托管对象【英文标题】:How to copy Core Data managed object in code 【发布时间】:2012-12-01 08:06:27 【问题描述】:我什至不确定我是否正确地说明了这一点,但我正在尝试复制用户创建的 coredata 对象实例并且很难弄清楚。
我有一个从managedObjectContext
中提取的对象(问题)。
这是来自我数据库中的一个测验,其中有很多问题。
我在内存中有一个名为 question1 的 Question 实例。我想将 question1 复制到一个名为 question2 的实例中。
Question *question2 = question1;
有时有效,但有时也会崩溃(我知道这不是正确的做法)
我一直在搞乱 NSCopying 和 -(id)copyWithZone:(NSZone *)
区域,但我只是得到一个空白实例。
如果有人能提供帮助,那就太感谢了!
这里有一点细节。
我有 question1,它是 Question 的一个实例。例如 question1.answer 将返回该问题的答案。
我只想将 question1 复制到 question2。我不需要将 question2 存储在数据模型中,或者我只需要在循环中使用它然后释放。
基本上我想这样做:
Question *question2 = question1;
NSLog(@"%@", question2.answer)
上述内容有时有效,但有时我会在 nslog 行上随机崩溃。
【问题讨论】:
【参考方案1】:您必须在托管对象上下文中创建一个新对象,然后复制所有属性和关系:
Question *question2 = [NSEntityDescription
insertNewObjectForEntityForName:@"Question"
inManagedObjectContext:context];
// Copy attributes:
question2.attr1 = question1.attr1;
question2.attr2 = question1.attr2;
// ...
// Copy relationships:
question2.rel1 = question1.rel1;
// ...
这可以使用question1
的NSEntityDescription
自动处理,并处理实体描述中的所有属性和关系,请参阅此问题的(很好的)答案:How can I duplicate, or copy a Core Data Managed Object?。但请注意,该代码还会复制所有相关对象,这可能不是您想要的。
我认为,如果没有太多的属性/关系,“手动”复制会更容易,并且您可以决定每个相关对象是否也必须复制。
【讨论】:
感谢您的回复,但我认为您误解了我,这是可以理解的,因为我的问题有点令人困惑。我在上面编辑了我最初的问题以提供更多信息。 @TouchMint:我很抱歉,但这就是我理解你的问题的方式。 - 我还看不到更新的问题,但如果您提供更多信息,我会尽力提供帮助。【参考方案2】:马丁的答案是正确的。您只能在托管对象上下文中实例化 NSManagedObject 子类。
在您的情况下,您说您不想保留复制的对象,您只想使用它。在这种情况下有选项:
-
在当前托管对象上下文中创建新对象,但不保存对象。
创建一个新的托管对象上下文在此托管对象上下文中创建您的副本,并且在删除第二个 moc 时不要保存它的内容。
创建一个不是 NSManagedObject 子类的自定义类。此类仅包含您要使用的
Question
类中的字段的副本。为这个接受Question
对象的新类编写一个初始化程序。然后,您可以在循环中使用这个新对象,而不必担心持久化它。
【讨论】:
好的,我会试一试这些解决方案。我想我真的希望我不必引入托管对象上下文。目前我刚刚通过了一个测验项目。我只是觉得很奇怪,它不能像字符串或 int 这样创建一个重复项。我真的只是需要它作为一个变量。无论如何,我会检查他的权利并投票给你,谢谢你的帮助。以上是关于如何在代码中复制 Core Data 托管对象的主要内容,如果未能解决你的问题,请参考以下文章
如何在通过 Core Data 保存我的 RestKit 托管对象之前对其进行修改?
如何使用 Core Data 设置 NSArrayController?