为了简化我的问题,这是我的核心数据模型(并没有完全合理,仅用于示例):
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"合并到一个记录,包括读者。
所以我的问题是如何有效地做到这一点 我正在考虑某种查询,它会给我带来多个具有相同标题的实例的所有书籍,然后根据标题将它们命令为组。
不确定这是否是正确的解决方案,
任何帮助将不胜感激
答案 0 :(得分:1)
我没有足够的时间来完整答案,但这里是指针:
您可以使用字典结果类型的提取请求来获取重复项。您必须按标题(属性描述)对其进行分组并添加计数列(表达式描述)。您可以使用having参数过滤结果,因此您只能获得计数>> 1的标题。
希望有所帮助。
答案 1 :(得分:0)
为什么要保留具有相同标题的书籍的多个实例。 即使两个对象具有相同的内容,它们仍然是不同的。 为什么不喜欢将读者添加到已创建的书籍对象中。 但是,如果你想合并你想要做的改变是
现在,您只有一个具有唯一书名的对象,其中包含所有读者,下次您必须添加阅读器
UPDATE
答案 2 :(得分:0)
取出所有书籍。然后找到独特的标题:
NSArray *uniqueBooks = [allBooks valueForKeyPath:@"@distinctUnionOfObjects.title"];
然后遍历uniqueBooks并为每本书获取所有匹配的实体。将实体转换为数组并执行另一个独特的过滤。
NSArray *uniqueReader = [allReaders valueForKeyPath:@"@distinctUnionOfObjects.name"];
现在你有一本书,那本书的所有读者都将它们插入一个新的商店。完成新商店的构建后,您可以使用它并删除旧商店。您也可以将它们插入到同一个商店中,但如果保留新的并删除旧的则会变得复杂,并且在删除时您必须小心删除行为等。