核心数据删除规则 - 多对多关系,空时删除

ric*_*ter 13 core-data objective-c

关于Core Data中关系的删除规则是如何工作的,我有点模糊,至少超出了文档中描述的简单情况.

大多数情况,以及我在这里看到的问题的大多数答案都使用了一个模型,其中一对多关系左侧的对象"拥有"右侧的对象:例如a Personhas PhoneNumbers,如果删除该人,则删除所有相关联的号码.在这种情况下,解决方案很明确:如果您设置如下关系,Core Data将为您处理所有事情:

Person      --(cascade)-->> PhoneNumber
PhoneNumber --(nullify)-->  Person
Run Code Online (Sandbox Code Playgroud)

我感兴趣的是相反的情况:"所有权"相反的多对多关系.例如,我可能会扩展CoreDataBooks示例代码以添加Author实体,以便在一个位置收集有关唯一作者的所有信息.A Book有一位作者,但作者有很多书...但我们并不关心我们没有列出书籍的作者.因此,不应该允许删除Authorbooks关系为非空的,并且删除Book引用特定的最后一个Author应删除该关系Author.

我可以设想手动执行此操作的几种方法......我不确定的是:

  • 核心数据是否有办法至少自动完成其中一些,就像关系删除规则一样?
  • 处理这种情况是否有"规范"的首选方式?

tim*_*tim 14

您可以prepareForDeletionBook班级中覆盖,并检查作者是否有任何其他书籍.如果没有,你可以删除作者.

- (void)prepareForDeletion {
    Author *author = self.author;
    if (author.books.count == 1) { // only the book itself
        [self.managedObjectContext deleteObject:author];
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:为了防止删除具有书籍的作者,您可以覆盖validateForDelete甚至更好:不要首先使用带有书籍的作者调用deleteObject

  • 除非有其他事情发生,否则这似乎会失败,例如,两个作者的书籍都会被删除.我在相应的prepareForDeletion中打印出author.books.count的值,两本书都是2.然后作者永远不会被删除.(更改了类名以匹配问题,但关系是相同的.) (2认同)