如何在代码中复制 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;
// ...

这可以使用question1NSEntityDescription 自动处理,并处理实体描述中的所有属性和关系,请参阅此问题的(很好的)答案:How can I duplicate, or copy a Core Data Managed Object?。但请注意,该代码还会复制所有相关对象,这可能不是您想要的。

我认为,如果没有太多的属性/关系,“手动”复制会更容易,并且您可以决定每个相关对象是否也必须复制。

【讨论】:

感谢您的回复,但我认为您误解了我,这是可以理解的,因为我的问题有点令人困惑。我在上面编辑了我最初的问题以提供更多信息。 @TouchMint:我很抱歉,但这就是我理解你的问题的方式。 - 我还看不到更新的问题,但如果您提供更多信息,我会尽力提供帮助。【参考方案2】:

马丁的答案是正确的。您只能在托管对象上下文中实例化 NSManagedObject 子类。

在您的情况下,您说您不想保留复制的对象,您只想使用它。在这种情况下有选项:

    在当前托管对象上下文中创建新对象,但不保存对象。 创建一个新的托管对象上下文在此托管对象上下文中创建您的副本,并且在删除第二个 moc 时不要保存它的内容。 创建一个不是 NSManagedObject 子类的自定义类。此类仅包含您要使用的 Question 类中的字段的副本。为这个接受Question 对象的新类编写一个初始化程序。然后,您可以在循环中使用这个新对象,而不必担心持久化它。

【讨论】:

好的,我会试一试这些解决方案。我想我真的希望我不必引入托管对象上下文。目前我刚刚通过了一个测验项目。我只是觉得很奇怪,它不能像字符串或 int 这样创建一个重复项。我真的只是需要它作为一个变量。无论如何,我会检查他的权利并投票给你,谢谢你的帮助。

以上是关于如何在代码中复制 Core Data 托管对象的主要内容,如果未能解决你的问题,请参考以下文章

如何取消删除 Core Data 中标记为删除的托管对象?

Core Data,我如何有效地查找和删除托管对象

如何在通过 Core Data 保存我的 RestKit 托管对象之前对其进行修改?

如何使用 Core Data 设置 NSArrayController?

使用 xcode 和 core-data 中的代码创建托管对象

如何根据 Core Data 中的关系对象创建 UITableView 部分