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

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

【讨论】:

这只是我为了演示这个问题而发明的一个例子。我正在寻找更有效的解决方案 @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)

如何使用合并策略捕获Core Data中的错误

vue源码学习--合并策略对象mergeOptions

在 R 中匹配和合并具有不同列名的数据集

Excel - 合并具有共同值的行并将差异连接在一列中

Javascript合并并组合具有相同ID的对象