ios - CoreData 根据不同的属性获取对象

标签 ios core-data nspredicate nsfetchrequest

我遇到问题已经有一段时间了,我已经想出了一个解决方案,但我正在重新审视它,希望找到一个真正的解决方案。不幸的是,这并没有发生。在 Core Data 中,我有很多 RSS 文章。用户可以订阅单个提要中的各个 channel 。问题是一些提要提供商在同一提要的多个 channel 中发布完全相同的文章。因此,用户最终会获得同一篇文章的 2 个以上版本。我想保留所有文章,以防用户取消订阅包含一份副本的 channel ,但仍订阅另一个包含副本的 channel ,但我只想在可用文章列表中显示一篇文章。

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

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

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

它现在可以工作,但我将开发这个应用程序的新版本,如果可能的话,我希望让它变得更好。感谢任何帮助,谢谢!

最佳答案

您可以使用propertiesToGroupBy像这样:

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

关于ios - CoreData 根据不同的属性获取对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20244868/

相关文章:

ios - NSURLSessionConfiguration TLSMinimumSupportedProtocol 看起来在 iOS 上不起作用

iphone - 立即拖动 MKAnnotationView

iphone - 将 NSNumber 设置为 NSManagedObject 属性

swift - 在应用程序启动时从 Core Data 获取数据

ios - 如何在另一个方法中调用具有多个输入参数的方法

ios - 当状态从开/关更改时自定义 UISwitch 弹跳 - IOS-7 错误?

ios - Swift - 如何检查现有的 Core Data Store iOS

ios - 类对于键 staticTexts 不符合键值编码

ios - 速度 : iOS Using NSPredicate filterUsingPredicate vs. for 循环

ios - 按 int 值过滤 NSArray 和 NSDictionary