我有一个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上),然后再次删除该临时对象。
答案 0 :(得分:1)
你得到的实际错误是什么?
根据您的说明,我猜您的PhonesViewController
列出了与您创建NSManagedObjectContext
实体的电话不同ForwardingData
的电话。这违反了与Core Data的关系规则。规则很简单,要在两个实体之间创建关系,它们必须来自同一个NSManagedObjectContext
实例。
我怀疑你在这种情况下创建临时NSManagedObjectContext
的原因。由于您保留ForwardingData
实体并且您知道何时被取消,因此在按下取消时删除临时实体而不是站起另一个NSManagedObjectContext
似乎更简洁。
如果您需要使用孩子(根据您的评论),那么您应该通过依赖注入更改PhonesViewController
以接受NSManagedObjectContext
。然后,您可以向它发送与您用于创建新实体的实例相同的NSManagedObjectContext
实例。通过这种改变,一切都会按照您的预期发挥作用。