了解一对多的核心数据删除规则
Posted
技术标签:
【中文标题】了解一对多的核心数据删除规则【英文标题】:Understanding Core Data delete rules on One to Many 【发布时间】:2015-05-29 02:33:05 【问题描述】:我对核心数据关系删除规则有点模糊。所以如果有人可以帮我回答一些关于他们的问题。
我有实体 A 和 B。A 与 B 有一对多关系,B 与 A 有一对一关系。
A>B
现在,如果我将 A 处的删除规则设置为 Cascade,我知道它将删除与其相关的所有 B。但是如果我将它设置为 Nullify,它会将 Bs 设置为 NIL 还是将外键设置为 Nil?
我到处查看从 B 到 A 的关系,我应该将其设置为 Nullify 吗?这是否会使 A 处的“B 对象”无效?或者它会使与 A 相关的所有 B 无效?级联呢?它会删除与 A 关联的所有 B,还是只删除特定的 B?
或者我只是在从 B 到 A 的关系上使用“No Action”,这样当我删除 B 时,A 不会发生任何变化,但对 B 的引用将不存在?
我对这些很困惑,所以请原谅我的问题。
谢谢。
【问题讨论】:
如果我在 One 关系上将其设置为“Nullify”(如下面的答案中建议的那样),则 NSBatchDeleteRequest(objectIDs: ...) 会引发错误。但是将其设置为“无操作”,这会产生编译器警告。 Apple 的文档不能令人满意。现在是 2020 年,仍然没有答案? 【参考方案1】:如果您将删除规则设置为“nullify”并删除 A 对象,则 Bs 中对该对象的引用将被删除。反之亦然。如果您有级联并删除 B,那么它将删除 B 指向的 A。然后它将遵循从 A 到剩余 B 的删除规则(级联或无效)。
您设置的规则实际上取决于您的数据模型。如果 A 是客户,B 是他们的订单,那么您可以将 A->B 规则设置为拒绝(如果客户有订单,则防止 A 被删除)或级联(删除客户时删除订单)。 B->A 规则可能是“无效”。如果订单被删除,只需从客户那里删除对该订单的引用。
关系删除规则见Apple Core Data Programming Guide
【讨论】:
而“什么都不做”会简单地保留引用,而不会真正存在,对吧? 是的,使用“No Action”删除 A 可能会导致 B 引用不存在的 A "Nullify 删除对象之间的关系,但不删除任何一个对象。这仅在员工的部门关系是可选的,或者您确保为每个对象设置一个新部门时才有意义下一次保存操作之前的员工。它说无效“不要删除任何一个对象”。这真的很令人困惑。所以如果我真的要删除A,我不能将规则设置为无效? 那句话出自哪里?这是不正确的。你删除的对象被删除,其他对象中对被删除对象的引用都将失效 @Paulw11 该引用直接来自关系删除规则 > 无效下的 Apple Core Data Programming Guide。我不确定它是否不正确,因为在删除删除规则无效的源对象后,我得到了重复的目标对象。【参考方案2】:使用删除规则进行更深入的解释和可视化。
假设我们有一个包含人员和工作表的数据库。一个人可以有很多任务要做。
样本数据和 ER 关系
删除规则说明
-
无操作:如果我在关系上添加此删除规则,然后删除其中一个人,那么它不会对该任务执行任何操作,但该人已被删除。 任务仍然指向我们删除的人。
-
Nullify :如果我应用此删除规则并删除人员,则关联任务将指向空人员。例如,我删除了 thor 并且 thor 任务将指向 null 的人。检查下面的输出。
-
级联:在此规则中,如果我删除此人,那么它将删除与此人关联的所有任务。例如,我删除了蜘蛛侠,检查下面的输出。
-
拒绝: 现在我们有一个人,即 IronMan 有 2 个任务。在这条规则中,如果我试图删除钢铁侠,那么它不允许我这样做。它在保存上下文时给出错误
"The operation couldn’t be completed. (Cocoa error 1600.)"
。现在要删除 Iron Man 人物,我们需要删除他所有相关的任务,然后我们才能删除 Person。
【讨论】:
【参考方案3】:如果你设置“nullify”并删除A的对象,A的对象和后面的关系只会被删除而不是B的对象。
eg : Customer 实体与订单有 nullify 关系。如果您从客户实体中删除客户,它只会从订单中删除客户及其后向关系。它不会删除客户的订单
但如果关系是“级联”的,它将删除客户及其订单。
如果是“拒绝”。如果客户有任何订单,它甚至不会删除删除客户。
【讨论】:
以上是关于了解一对多的核心数据删除规则的主要内容,如果未能解决你的问题,请参考以下文章
使用核心数据,当一对多关系低于最小计数时,是一种自动删除实体的方法吗?