0

我什至不确定我是否说得对,但我正在尝试复制用户创建的 coredata 对象实例并且很难弄清楚。

我有一个从managedObjectContext.

这是来自我的数据库中的一个测验,它有很多问题。

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

Question *question2 = question1;

有时有效,但有时也会崩溃(我知道这不是正确的做法)

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

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

这里有一些更详细的信息。

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

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

基本上我想这样做:

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

上述内容有时有效,但有时我会在 nslog 行上随机崩溃。

4

2 回答 2

6

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

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

这可以使用NSEntityDescriptionofquestion1和处理实体描述中的所有属性和关系来自动化,请参阅此问题的(很好的)答案:如何复制或复制核心数据托管对象?. 但请注意,该代码还复制了所有相关对象,这可能不是您想要的。

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

于 2012-12-01T08:50:34.020 回答
1

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

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

  1. 在当前托管对象上下文中创建新对象,但不保存对象。
  2. 创建一个新的托管对象上下文在此托管对象上下文中创建您的副本,并且在删除它时不要保存第二个 moc 的内容。
  3. 创建一个不是 NSManagedObject 子类的自定义类。此类仅具有Question您要使用的类中的字段的副本。为这个接受Question对象的新类编写一个初始化程序。然后你可以在你的循环中使用这个新对象,而不用担心持久化它。
于 2012-12-01T09:46:11.107 回答