【问题标题】:Core Data: save error after deleting objects with a non-optional relationship核心数据:删除具有非可选关系的对象后保存错误
【发布时间】:2023-04-07 00:02:02
【问题描述】:

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

删除子对象后,Core Data 拒绝保存,抱怨子实体中缺少必需的属性。如果反向关系是可选的,错误就会消失。

为什么我不能在符合逻辑的情况下建立强制性的反向关系(一个孩子必须有一个父母)?为什么 Core Data 抱怨 已删除对象的 不一致?这是预期的行为吗?

感谢您的澄清。

编辑:根据要求,我附上了我的测试数据模型的图片:

至于删除代码的问题,没有。这一切都是通过在应用程序窗口 nib 中设置的NSArrayController 绑定完成的。您可以在此处加载测试项目:Parent-child test project。应该提一下,这个项目是基于NSPersistentDocument架构的。

我观察到的行为如下:如果创建了一个没有子级的父级,则文档可以正常保存。如果创建一个子级然后删除,则在尝试保存文档时会出现错误消息:

【问题讨论】:

  • 请告诉我们型号,删除代码和错误信息。

标签: macos core-data relationship


【解决方案1】:

我刚刚找到了我自己问题的答案。

我观察到的对象在从关联的NSArrayController 删除后仍然存在的问题与控制器的-remove:-removeObject: 方法的默认操作有关。根据 Apple 文档 (NSArrayController -removeObject: method):

但是,如果接收者的 contentSet 绑定到关系,removeObject:默认情况下只从关系中删除对象(而不是从对象图中)。不过,您可以为 contentSet 绑定设置“删除时删除对象”选项,在这种情况下,对象会被标记为删除以及从关系中删除。

这同样适用于-remove: 方法。在子数组控制器 contentSet 绑定中设置 'Deletes Object on Remove' 即可解决问题。

【讨论】:

  • 感谢您发布此信息。这让我困惑了很久。
【解决方案2】:

查看您的附加信息,会弹出一件事:删除规则

让我们想一想你的children 关系的Cascade 设置会发生什么。

Child deleted --> cascade = parent deleted --> possible other orphaned children

也许这就是正在发生的事情?尝试将删除规则设置为Nullify

【讨论】:

  • 根据 Apple 的说法,我的模型看起来是正确的,包括删除规则,假设孩子必须有一个唯一的父母(请参阅 Relationship Definitions in the Model)。但我发现我错了:-)(见我自己的答案)。
【解决方案3】:

也许你是反过来的?

子项与父项的一对一关系不应是可选的。
父母与孩子的一对多关系应该是可选的。

我刚刚测试了这个设置,它可以工作。

【讨论】:

  • 是的,这正是我所拥有的(请参阅帖子中添加的详细信息)。到目前为止,我没有在代码中这样做,在这个问题之前我也没有打算这样做。也许持久文档堆栈中发​​生了一些奇怪的事情,但我希望这些简单的事情可以开箱即用。
猜你喜欢
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多