【问题标题】:database app with one-to-many relationship has stray objects具有一对多关系的数据库应用程序有杂散对象
【发布时间】:2014-08-15 14:54:33
【问题描述】:

我有一个 entityA >entityB 的数据库应用程序。要加载数据,两个实体都有 nstableviews。我的问题是我已经输入了适用于 entityA 的 entityB 的数据,但是当我将数据库加载到我的 iphone 应用程序中时,出现了几个 entityB,而没有任何相关的 entityA。我在想 entityB 的添加没有选择 entityA,也许这就是它们在 iphone 应用程序中“浮动”的原因。

一些问题: 有没有人经历过这个? 有没有办法在我的向下钻取数据库应用程序中防止这种情况? 有没有办法对其进行编码,所以如果任何 entityB 与 entityA 没有关系,则将其删除?

【问题讨论】:

    标签: ios iphone database core-data one-to-many


    【解决方案1】:

    回答您的问题。

    1.有人经历过吗?

    当然,很多人都经历过这种情况。但是如果你对你写的代码很小心的话,我应该不太可能。

    2.有没有办法在我的向下钻取数据库应用程序中防止这种情况发生?

    当然。只需确保有一个父实体,如果没有就创建一个。如果 A 实体存在,它只是一个单行。

    newBEntity.a = existingAEntity;
    

    3.有没有办法对其进行编码,所以如果任何 entityB 与 entityA 没有关系,则将其删除?

    理论上,是的,但这将是糟糕的代码设计。只需使用上面 2. 中的过程:创建 B,如果没有 A 实体,则将其丢弃(例如,通过在托管对象上下文中调用 rollback)。或者,按照建议,创建一个新的 A 实体。

    您也可以(定期或在应用启动和关闭时)遍历所有 B 实体并删除孤立的实体,但这将是非常糟糕的数据设计。

    【讨论】:

    • 我的模型也有A>B>C。看来我可以添加到 B 的 nstableview 中,这意味着它与 A 无关。实现它会是不好的代码吗: - (void)prepareForDeletion { B *b = self.b; if (b.bToA.count == 0) { [self.managedObjectContext deleteObject:b]; } }
    • 这段代码没问题,但并不理想。存在与给定实体相关联的其他实体这一事实并不是一个好的论据。正如已经指出的那样,最好使用托管对象模型中的cascade 规则来处理删除。
    【解决方案2】:

    确保你已经为你的关系指定了逆向,以及正确的删除规则。

    根据 Apple 文档,您应该为每个关系提供一个逆向关系,即使您只打算在一个方向上使用它。不这样做可能会导致您所描述的模型完整性失败。

    【讨论】:

      猜你喜欢
      • 2019-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-30
      • 1970-01-01
      相关资源
      最近更新 更多