核心数据:删除多对多关系中的实体

时间:2012-05-25 05:38:58

标签: core-data many-to-many

在我的CoreData数据模型中,有一个Note实体和一个Tag实体,它们有多对多的关系,因此每个Note可以有很多标签,每个标签可能属于许多Notes。

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

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

假设我有一个注释标签'cat','dog','pig',我删除'pig'并添加'bird',起初我有一个字符串: “猫,狗,鸟”,然后是“猫”,“狗”,“鸟”,

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

谢谢!

1 个答案:

答案 0 :(得分:3)

删除某个对象并将其从关系中移除时,您会感到困惑。

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

delete rule

如果删除规则为“nullify”,则表示您可以从关系中删除对象而不删除该对象。在这种情况下,这听起来像你想要的:你希望能够从特定音符的关系中删除标签,而不会影响使用标签的所有其他音符。

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

在伪代码中:

  1. 从当前记事中删除所有标记。
  2. 制作一个可变的集合,以容纳你想要添加的集合。
  3. 获取链接标记的新字符串数组
  4. 对于每个标记字符串,请执行以下操作:
    1. 创建谓词以查找具有该名称的Tag对象。创建一个获取请求,并执行它。
    2. 查看结果:如果有返回的标记(即结果数组中包含> 0个对象),请将其添加到可变集中。
    3. 如果没有返回的标签(即没有带该名称的标签),请创建一个新的Tag对象。将其添加到您的可变集中。
  5. 将Note的tags属性设置为新的标记集。
  6. 执行此操作的另一种方法是让NSMutableSet *mySet = [yourNote mutableSetValueForKey:@"tags"]调用{{1}},该方法允许您从关系中一次添加和删除一个标记。这将返回一组可变标记对象,并且Core Data会自动查看您对该集所做的任何更改。因此,您可以从中删除对象,然后该对象将不再处于关系中,或者您可以向该集添加另一个标记,并且它将与该注释相关。

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