了解核心数据删除一对多的规则

时间:2015-03-25 12:13:57

标签: ios objective-c swift core-data relationships

我对Core Data Relationships删除规则有点模糊。所以,如果有人可以帮我回答一些关于他们的问题。

我有实体A和B. A与B有to-Many关系,而B与A有to-One关系。

A< --->>乙

现在,如果我将A中的删除规则设置为Cascade,我知道它会删除与之相关的所有B。但是如果我将它设置为Nullify,它会将Bs设置为NIL还是将外键设置为Nil?

我到处看看B到A之间的关系,我应该把它设置为Nullify吗?那只会扼杀" B对象"在A?或者它会否使与A相关的所有B都无效? Cascade怎么样?它会删除与A关联的所有B,还是仅删除特定的B?

或者我只是使用" No Action"关于从B到A的关系,这样当我删除B时,A不会发生变化,但是对B的引用不会存在?

我很担心这些,所以请原谅我的问题。

感谢。

3 个答案:

答案 0 :(得分:63)

如果将删除规则设置为“nullify”并删除A对象,则将删除对Bs中该对象的引用。逆向工作方式相同。如果你有级联并删除B,那么它将删除B指向的A.然后它将遵循从A到剩余B的删除规则(级联或无效)。

您设置的规则实际上取决于您的数据模型。如果A是客户而B是他们的订单,那么您可以将A-> B规则设置为拒绝(如果客户有订单则阻止A被删除)或级联(删除客户时删除订单)。 B-> A规则可能是“无效”。如果删除订单,只需从客户处删除对订单的引用。

关系删除规则在Apple Core Data Programming Guide

中描述

答案 1 :(得分:2)

如果您设置“ nullify”并删除A的对象,则仅删除A的对象和后向关系,而不删除B的对象。

例如:客户实体与订单具有取消关系。如果您从客户实体中删除客户,则只会从order中删除客户及其后退关系。它不会删除客户的订单

但是,如果关系是“级联”,它将删除客户及其订单。

如果为“ deny”。如果客户有任何订单,则不会删除甚至删除客户。

答案 2 :(得分:0)

使用删除规则进行更深入的说明和可视化。


假设我们拥有与表人员一起工作的数据库。单人可以完成许多任务。

  

示例数据和ER关系

     

enter image description here enter image description here enter image description here


删除规则说明

  1. 无操作::如果我在关系上添加此删除规则,然后删除其中一个人,则该任务不会执行任何操作,但会删除人。 任务仍然指向我们删除的人。

    • 用例:我认为它没有在任何地方使用。
  2. 无效::如果我应用此删除规则并删除人员,则关联任务将指向空人员。例如,我删除了thor,thor任务将指向空的人。检查下面的输出。

    enter image description here

    • 用例:让我们假设我们有带有Person和地址的数据库。现在人把房子卖给经纪人。在这种情况下,您可以使该地址的人为空,并在新的人购买该房屋时将所有者重新分配给该房屋。
  3. 级联:在此规则中,如果我删除此人,则它将删除与该人相关的所有任务。例如,我删除了蜘蛛侠,请检查下面的输出。

    enter image description here

    • 用例:假设我们有一个用户及其朋友列表。如果用户帐户已删除,那么我们也要删除朋友列表。
  4. 拒绝:现在,我们有一个人,即IronMan,有两个任务。在此规则中,如果我尝试删除“钢铁侠”,则不允许这样做。保存上下文时出现错误"The operation couldn’t be completed. (Cocoa error 1600.)"。现在要删除钢铁侠人物,我们需要删除他的所有相关任务,然后才能删除该人物。

    • 用例:假设有一个拥有银行帐户的用户。在用户关闭帐户之前,我们无法从银行中删除该用户。