如何正确级联删除Core Data中的托管对象?

时间:2010-01-23 17:37:42

标签: cocoa core-data data-modeling cascade

我有一个核心数据模型,它有三个实体:A,B和C.A与B有一对多关系,B与C有多对多关系。删除规则为A - > B是“级联”,B - > A是“不行动”。 B的删除规则 - > C是“无动作”,C - > B是“拒绝”。

我在A实体上执行删除时遇到问题。我想要发生的是以下几点:

  1. 我删除了A的实例(使用deleteObject:
  2. 删除传播到与A关联的任何B(由于“级联”删除规则)
  3. 删除与A关联的所有B
  4. 任何属于C的关系,其关联的B都被删除,也将被删除
  5. 这可能有点令人困惑,所以让我解释一下:删除A时,删除所有关联的B。任何引用这些B的C都不能再引用它们了。

    在我的测试中,我没有看到“Cascade”删除规则对我起作用。当我删除A时,我立即调用processPendingChanges(只是为了确保删除已经完成)。然后我比较删除之前和之后NSManagedObjectContext中A和B的数量。 A的实例已被正确删除,(总A的数量现在比删除前少一个)。但是,B的数量保持不变。因此,似乎没有尊重“级联”删除规则。

    我知道我可以手动通过A - > B关系,并手动删除每个B.然而,似乎这是Core Data免费提供的东西,所以除非Core Data不足,否则我不想这样做。有关使用“级联”删除规则的任何信息都是受欢迎的。

2 个答案:

答案 0 :(得分:16)

我当然不是核心数据专家,但是阅读documentation on the various delete rule options,在我看来,你想要B - > C关系 Nullify ,而不是 No Action 。也许Bs不会消失,因为Cs仍然持有对它们的引用?

答案 1 :(得分:1)

基于

  

属于C的任何关系,其关联的B被删除,   也被删除   建议B-C也应该有Cascade。

此外,如果删除B,则也应删除C.再次Cascade。

  • Nullify通常用作反向删除规则*

即。 B与A的关系是Nullify。与B的C关系是Nulllify。这样当删除C时,不会删除B.当B被删除时; A不会被删除。

正如这张获奖图纸一样。

A --->> B级联  < ---- Nullify

B --->> C Cascade  < ---- Nullify