如何删除子托管对象上下文中的临时对象?

时间:2014-02-08 19:32:12

标签: ios core-data

我有一个CodeData模型[Phone]<< --->> [Forwarding]。因此Phone对象设置了Forwardings,反之亦然。

我有一个电话列表,并希望将其中一个添加到新的转发中。

ForwardingViewController我这样做:

// Create a new managed object context; set its parent to the fetched results controller's context.
managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[managedObjectContext setParentContext:[fetchedResultsController managedObjectContext]];
self.forwarding = (ForwardingData*)[NSEntityDescription insertNewObjectForEntityForName:@"Forwarding"

因此,这会创建一个子MOC和一个现在临时的转发。

然后我将self->forwarding传递给显示所有电话的PhonesViewController(在表格中)。这个视图控制器只是导航推送。

当用户点击表格中的一个电话时,我会这样做:

[self.forwarding addPhonesObject:phone];

addPhonesObject是CoreData生成的访问者。

现在,当用户回到ForwardingViewController并点击取消按钮时(因为他决定他不想创建新的转发),它将被解除,这会清除这个孩子{{ 1}}以及managedObjectContext

执行上述操作后,我收到数据库错误(Cocoa错误1550)。当试图理解控制台输出时,我的猜测是Forwarding确实被删除了,但是Phone对象(当然还在那里)现在对这个被删除的Forwarding有一个空引用。

我的问题。我应该如何正确处理这种情况:在子MOC上创建临时对象,将其链接到另一个对象(在父MOC上),然后再次删除该临时对象。

1 个答案:

答案 0 :(得分:1)

你得到的实际错误是什么?

根据您的说明,我猜您的PhonesViewController列出了与您创建NSManagedObjectContext实体的电话不同ForwardingData的电话。这违反了与Core Data的关系规则。规则很简单,要在两个实体之间创建关系,它们必须来自同一个NSManagedObjectContext实例。

我怀疑你在这种情况下创建临时NSManagedObjectContext的原因。由于您保留ForwardingData实体并且您知道何时被取消,因此在按下取消时删除临时实体而不是站起另一个NSManagedObjectContext似乎更简洁。

更新

如果您需要使用孩子(根据您的评论),那么您应该通过依赖注入更改PhonesViewController以接受NSManagedObjectContext。然后,您可以向它发送与您用于创建新实体的实例相同的NSManagedObjectContext实例。通过这种改变,一切都会按照您的预期发挥作用。