核心数据 - 合并具有共同价值的对象

时间:2014-09-08 09:21:21

标签: ios objective-c core-data nspredicate

为了简化我的问题,这是我的核心数据模型(并没有完全合理,仅用于示例):

Book  
-------  
- title  

- readers (to-many relationship to Reader)  


Reader  
------  
- name  

- book (to-one relationship to Book)  

目前,具有相同标题的书籍可以在db中有多个实例 但我想改变这一点,我想将所有具有相同标题的书籍合并到一个实例(删除所有其余的)并合并他们的读者。

例如,如果我的数据库看起来像这样:
1.书名" A"读者:" 1"," 2"," 3"
2.书名" B"读者:" 4"," 5"," 3"," 7"
3.书名" A"读者:" 4"," 1"

新的数据库将是:
1.书名" A"读者:" 1"," 2"," 3"," 4"
2.书名" B"读者:" 4"," 5"," 3"," 7"

正如你所看到的,这两本书的标题都是" A"合并到一个记录,包括读者。

所以我的问题是如何有效地做到这一点 我正在考虑某种查询,它会给我带来多个具有相同标题的实例的所有书籍,然后根据标题将它们命令为组。

不确定这是否是正确的解决方案,
任何帮助将不胜感激

3 个答案:

答案 0 :(得分:1)

我没有足够的时间来完整答案,但这里是指针:

您可以使用字典结果类型的提取请求来获取重复项。您必须按标题(属性描述)对其进行分组并添加计数列(表达式描述)。您可以使用having参数过滤结果,因此您只能获得计数>> 1的标题。

希望有所帮助。

答案 1 :(得分:0)

为什么要保留具有相同标题的书籍的多个实例。 即使两个对象具有相同的内容,它们仍然是不同的。 为什么不喜欢将读者添加到已创建的书籍对象中。 但是,如果你想合并你想要做的改变是

  • 首先使用谓词
  • 获取所有具有相同标题的书籍,如“A”
  • 将第一个对象视为要在所有其他对象中合并的对象,迭代所有对象并添加其读取器,但只添加名称在第一个对象中尚未存在的对象。
  • 删除标题为“A”的所有图书对象,但第一个除外。

现在,您只有一个具有唯一书名的对象,其中包含所有读者,下次您必须添加阅读器

  • 从商店中获取已创建的图书实例。
  • 在其中添加阅读器对象。

UPDATE

  • 仅获取具有特定标题的第一个Book对象
  • 然后查询商店中书名相同的所有读者,并将书籍对象设置为此书。
  • 删除具有特定标题的所有其他Book对象,除了您使用的第一个。
  • 删除图书对象中多次出现的读者。

答案 2 :(得分:0)

取出所有书籍。然后找到独特的标题:

NSArray *uniqueBooks = [allBooks valueForKeyPath:@"@distinctUnionOfObjects.title"];

然后遍历uniqueBooks并为每本书获取所有匹配的实体。将实体转换为数组并执行另一个独特的过滤。

NSArray *uniqueReader = [allReaders valueForKeyPath:@"@distinctUnionOfObjects.name"];

现在你有一本书,那本书的所有读者都将它们插入一个新的商店。完成新商店的构建后,您可以使用它并删除旧商店。您也可以将它们插入到同一个商店中,但如果保留新的并删除旧的则会变得复杂,并且在删除时您必须小心删除行为等。