如何在代码中复制Core Data托管对象

时间:2012-12-01 08:06:27

标签: ios xcode core-data

我甚至不确定我是否说明了这一点,但我正在尝试复制用户创建的coredata对象intstance,并且很难搞清楚它。

我有一个从managedObjectContext拉入的对象(问题)。

这来自我的数据库中有很多问题的测验。

我的内存中有一个名为question1的Question实例。我想将question1复制到一个名为question2的实例。

Question *question2 = question1;

有时工作但有时也崩溃(我知道这不是正确的方法)

我一直在搞乱NSCopying和-(id)copyWithZone:(NSZone *)区域,但我只是得到一个空白的实例。

如果有人能提供帮助,那将非常感谢!

这里有一些细节。

我有问题1它是问题的一个实例。例如,question1.answer将返回问题的答案。

我想简单地将问题1复制到问题2。我不需要在数据模型中存储question2或者我只需要在循环中使用它然后释放。

基本上我想这样做:

Question *question2 = question1;
NSLog(@"%@", question2.answer)

以上是有时工作但有时我在nslog行上遇到随机崩溃。

2 个答案:

答案 0 :(得分:6)

您必须在托管对象上下文中创建一个新对象,然后复制所有属性和关系:

Question *question2 = [NSEntityDescription
                           insertNewObjectForEntityForName:@"Question"
                           inManagedObjectContext:context];
// Copy attributes:
question2.attr1 = question1.attr1;
question2.attr2 = question1.attr2;
// ...
// Copy relationships:
question2.rel1 = question1.rel1;
// ...

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

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

答案 1 :(得分:1)

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

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

  1. 在当前托管对象上下文中创建新对象,但不保存对象。
  2. 创建新的托管对象上下文在此托管对象上下文中创建副本,并在删除时不保存第二个moc的内容。
  3. 创建一个不是NSManagedObject的子类的自定义类。此类只包含您要使用的Question类中的字段的副本。为这个带有Question对象的新类写一个初始化器。然后你可以在你的循环中使用这个新对象,而不用担心它会持久化。
相关问题