Core Data - 合并具有共同价值的对象
Posted
技术标签:
【中文标题】Core Data - 合并具有共同价值的对象【英文标题】:Core Data - merge objects with mutual value 【发布时间】:2014-09-08 09:21:20 【问题描述】:为了我的问题的简单性,这是我的核心数据模型(并不完全有意义,仅用于示例):
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”的两本书都合并为一条记录,包括读者。
所以我的问题是如何有效地做到这一点。 我正在考虑某种查询,它将为我带来所有具有多个具有相同标题的实例的书籍,然后可能根据标题将它们排序到组中。
不确定这是否是正确的解决方案, 任何帮助将不胜感激
【问题讨论】:
【参考方案1】:我没有足够的时间给出完整的答案,但这里是指针:
您可以使用字典结果类型的获取请求来获取重复项。您必须按标题(属性描述)对其进行分组并添加一个计数列(表达式描述)。您可以使用有参数过滤结果,因此您只能获得 count>1 的标题。
希望对您有所帮助。
【讨论】:
【参考方案2】:为什么要保留同名图书的多个实例。 即使两个对象具有相同的内容,它们仍然是不同的。 您为什么不喜欢将读者添加到已创建的图书对象中。 但是,如果您想合并更改,您仍然想做的是
首先使用谓词获取所有具有相同标题的书籍,例如“A” 将第一个对象视为您要合并到所有其他对象中的对象,而是遍历所有对象并添加其读者,但仅添加那些名称尚未出现在第一个对象中的对象。 删除所有标题为“A”的图书对象,但第一个除外。现在您将只有一个具有唯一书名的对象具有所有读者,并且下次您必须添加一个读者
从商店中获取已创建的图书实例。 在其中添加阅读器对象。UPDATE
【讨论】:
这只是我为了演示这个问题而发明的一个例子。我正在寻找更有效的解决方案 @Mario 我已经更新了答案,提高了效率。【参考方案3】:获取所有书籍。然后找到唯一的标题:
NSArray *uniqueBooks = [allBooks valueForKeyPath:@"@distinctUnionOfObjects.title"];
然后遍历 uniqueBooks 并为每本书获取所有匹配的实体。将实体转换成数组,再做一次唯一的过滤。
NSArray *uniqueReader = [allReaders valueForKeyPath:@"@distinctUnionOfObjects.name"];
现在您有了一本书,该书的所有读者都将它们插入新的商店。完成构建新商店后,您可以使用它并删除旧商店。您也可以将它们插入同一个商店,但是如何保留新的和删除旧的会变得很复杂,并且在删除时您必须小心删除行为等。
【讨论】:
以上是关于Core Data - 合并具有共同价值的对象的主要内容,如果未能解决你的问题,请参考以下文章
合并具有相同属性但 ID 不同的 NSManagedObject,与 iCloud 同步会导致重复(Core Data,Swift 1.2)