核心数据:删除具有非可选关系的对象后保存错误

时间:2012-06-22 19:31:22

标签: macos core-data relationship

我有一个简单的数据模型:与子实体可选的一对多关系中的父实体。反向关系(子 - >父)是强制性的(非可选)。

删除子对象后,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

3 个答案:

答案 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