如何创建谓词以获取同一属性的所有不重复结果的实体?

Posted

技术标签:

【中文标题】如何创建谓词以获取同一属性的所有不重复结果的实体?【英文标题】:How to create predicate to fetch all entities with not repeated results for the same property? 【发布时间】:2018-08-22 07:09:25 【问题描述】:

我需要为多种语言实施常见问题解答。所以我创建了具有以下属性的实体Question

language collection - 用不同语言标记同一个问题

存储

所有这些都保存在 iCloud 中的公共数据库中。

正在抓取

在一个应用程序中,我获取有关en 语言和应用程序上安装的当前语言的所有问题。全部保存在核心数据中。

显示

我需要显示(使用 FRC)当前语言的所有问题和英语的所有问题(如果没有为当前语言创建具有相同 collection 的问题)。

示例(问题、语言、集合):

Q1, pl, 1
Q2, pl, 3
Q3, en, 1
Q4, de, 1
Q5, es, 2
Q6, en, 2

如果我当前的语言是pl,那么我想获取以下问题:

Q1, pl, 1
Q2, pl, 3
Q6, en, 2

我怎样才能做到这一点?我需要创建 NSPredicate 来简单地排除那些不希望获取它们的问题。

【问题讨论】:

我猜你需要一个子查询,但我不知道如何针对同一个实体做一个子查询。是否过时了,因为一个直接的选择是阅读两种语言的所有内容并删除代码中的重复项? 【参考方案1】:

解决方案 1

你想多了这个问题。如果您处理的实体少于 500 个(我假设您是这样),那么通过查询过滤或在获取后执行内存过滤器之间的性能差异很小。此外,您似乎不必处理获取后更改的对象 - 因此使用 fecthedResultsController 并没有很大的好处。只需将它们全部取出,然后像处理任何数组一样过滤和排序它们。

如果您不排序和显示用户数据,而只是从服务器下载静态数据,则可能值得考虑不使用 core-data - 但我相信您已经研究过这些替代方案。

解决方案 2

您可以使用 sectionKeyPath 使用 fecthedResultsController 解决此问题。按集合对请求进行排序,然后按集合对它们进行分组。现在每个部分都代表一个集合。使 collectionView 中的行数等于 FRC 节数。对于每一行,请查看该部分并选择使用最喜欢的语言的问题。这仅在您按“收藏”键排序时才有效。如果您想对它们进行不同的排序,您可以更改“集合”值,而不仅仅是随机 int 或 uuid,而是以您想要的方式排序。

【讨论】:

以上是关于如何创建谓词以获取同一属性的所有不重复结果的实体?的主要内容,如果未能解决你的问题,请参考以下文章

CoreData 性能重复实体与属性

核心数据:返回另一个实体的对象的谓词

如何使用谓词过滤子实体集合?

以字典为属性的实体的谓词

子查询谓词核心数据

核心数据获取请求关系属性谓词