CoreData基于distinct属性获取对象

时间:2013-11-27 14:19:09

标签: ios core-data nspredicate nsfetchrequest

我有一段时间遇到了问题而且我已经破解了一个解决方案,但我正在重新审视它,希望找到一个真正的解决方案。不幸的是,这没有发生。在核心数据中,我收到了大量的RSS文章。用户可以在单个订阅源中订阅各个频道。问题是一些饲料供应商在同一饲料的多个渠道中发布完全相同的文章。因此,用户最终会获得同一篇文章的2个以上版本。我希望保留所有文章,以防用户取消订阅包含一个副本的频道,但仍然订阅另一个包含副本的频道,但我只想在可用文章列表中显示一篇文章。

为了识别重复项,我创建了文章文本内容的哈希值,并将其作为属性存储在Core Data(text_hash)中的Article实体上。我最初的想法是,我能够制作一个获取请求,可以根据此属性上的唯一匹配来获取文章,类似于SQL查询。结果并非如此(我当时只是在学习核心数据)。

所以为了破解解决方案,我获取所有文章,我创建一个空集,我枚举获取结果,检查散列是否在集合中。如果是,我忽略它,如果它不是,我将它添加到集合,我将文章ID添加到数组。当我完成后,我会根据文章ID创建一个谓词并进行另一次提取。

这看起来真的很浪费和笨拙,不仅是我取两次并枚举结果,因为最终谓词是基于单个文章ID,每次添加新文章时我都必须重新运行它。

它现在有效,但我打算开发这个应用程序的新版本,我想尽可能做得更好。感谢任何帮助,谢谢!

1 个答案:

答案 0 :(得分:3)

你可以这样使用propertiesToGroupBy

NSFetchRequest *fr = [NSFetchRequest fetchRequestWithEntityName:@"Article"];
fr.propertiesToGroupBy = @[@"text_hash"];
fr.resultType = NSDictionaryResultType;
NSArray *articles = [ctx executeFetchRequest:fr error:nil];