我有一个简单的数据模型:与子实体可选的一对多关系中的父实体。反向关系(子 - >父)是强制性的(非可选)。
删除子对象后,Core Data拒绝保存,抱怨子实体中缺少必需属性。如果反向关系是可选的,则错误消失。
为什么我不能在逻辑上有一个强制性的反向关系(即。一个孩子必须有一个父母)?为什么Core Data会抱怨已删除对象的不一致?这是预期的行为吗?
感谢您的任何澄清。
编辑:根据要求,我提供了我的测试数据模型的图片:
Test parent-child Core Data model http://s15.postimage.org/73fs2j1jv/Parent_child_data_model.gif
关于删除代码的问题,没有。这一切都是通过在应用程序窗口nib中设置的NSArrayController
绑定完成的。您可以在此处加载测试项目:Parent-child test project。应该提到的是,该项目基于NSPersistentDocument
架构。
我观察到的行为如下:如果创建没有子节点的父节点,则可以正常保存文档。如果创建了一个子项然后将其删除,则在尝试保存文档时会出现错误消息:
Parent-child error message http://s7.postimage.org/bd4o5nk4b/Parent_child_error_message.gif
答案 0 :(得分:3)
我刚刚发现了自己问题的答案。
从关联的NSArrayController
删除后,我观察到的对象延迟的问题与控制器的-remove:
和-removeObject:
方法的默认操作有关。根据Apple文档(NSArrayController -removeObject: method):
但是,如果接收者的contentSet绑定到关系,则removeObject:默认情况下仅从关系中删除对象(而不是从对象图中删除)。但是,您可以为contentSet绑定设置“删除删除对象”选项,在这种情况下,对象将被标记为删除以及从关系中删除。
这同样适用于-remove:
方法。在子数组控制器contentSet绑定中设置“删除删除对象”可以解决问题。
答案 1 :(得分:0)
也许你反过来了?
孩子与父母的一对一关系不是可选的。
父母与孩子的多人关系应该是可选的。
我刚测试了这个设置,但它确实有效。
答案 2 :(得分:0)
查看您的其他信息,会突然出现一个问题:删除规则。
让我们暂时考虑一下Cascade
关系的children
设置可能会发生什么。
Child deleted --> cascade = parent deleted --> possible other orphaned children
也许这就是发生的事情?尝试将删除规则设置为Nullify
。