【问题标题】:CoreData: delete entity in many-to-many relationshipCoreData:删除多对多关系中的实体
【发布时间】:2023-03-19 13:59:01
【问题描述】:

在我的CoreData数据模型中,有一个Note实体,一个Tag实体,它们有多对多的关系,所以每个Note可以有很多个Tag,每个Tag可能属于很多个Note。

标签以逗号分隔的字符串形式输入: 猫、狗、猪

然后我将字符串拆分为'cat'、'dog'、'pig'

假设我有一个带有标签'cat'、'dog'、'pig'的便笺,并且我删除了'pig'并添加了'bird',起初我有一个字符串: “猫、狗、鸟”然后是“猫”、“狗”、“鸟”,

现在我该怎么办?我应该删除此注释的所有标签并重新添加所有标签吗?但是一旦我删除了所有标签,共享相同标签的其他笔记会丢失这些标签吗?

谢谢!

【问题讨论】:

    标签: core-data many-to-many


    【解决方案1】:

    您将删除对象与从关系中删除对象混淆了。

    首先,检查你的关系的删除规则:

    如果删除规则是“nullify”,那么这意味着您可以从关系中删除对象而不删除对象。在这种情况下,这听起来像是您想要的:您希望能够从与特定笔记的关系中删除标签,而不会影响使用该标签的所有其他笔记。

    关于实际修改与新标签集的关系,您可以做两件事。第一种方法就像您提到的那样,只需从笔记中删除所有标签并重新添加它们。这实际上是一个很好的计划。当然,在添加标签时,对于每个标签,您需要先检查它是否存在,如果存在,请将现有标签添加到关系中。

    在伪代码中:

    1. 删除当前笔记中的所有标签。
    2. 制作一个可变集合,以保存您要添加的集合。
    3. 获取链接标签的新字符串数组
    4. 对于每个标签字符串,请执行以下操作:
      1. 创建谓词以查找具有该名称的标记对象。创建一个获取请求并执行它。
      2. 查看结果:如果有返回标签(即结果数组中有 >0 个对象),请将其添加到您的可变集合中。
      3. 如果没有返回标签(即没有具有该名称的标签),则创建一个新的标签对象。将其添加到您的可变集合中。
    5. 将 Note 的 tags 属性设置为新标签集。

    另一种方法是调用NSMutableSet *mySet = [yourNote mutableSetValueForKey:@"tags"],它允许您从关系中一次添加和删除一个标签。这将为您返回一组可变的标记对象,并且您对集合所做的任何更改都会被 Core Data 自动看到。因此,您可以从中删除一个对象,然后该对象将不再处于关系中,或者您可以将另一个标签添加到集合中,它将与笔记相关。

    在任何时候,我们都没有从数据库中删除对象。您的所有标签仍然存在,我们只是更改了哪些标签与哪些笔记相关。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-04
      • 2012-10-10
      • 1970-01-01
      • 1970-01-01
      • 2021-08-08
      • 2016-12-22
      • 1970-01-01
      相关资源
      最近更新 更多