【发布时间】:2013-11-27 14:19:08
【问题描述】:
我遇到了一段时间的问题,我已经想出了一个解决方案,但我正在重新审视它,希望找到一个真正的解决方案。不幸的是,这并没有发生。在 Core Data 中,我有一堆 RSS 文章。用户可以在单个提要中订阅各个频道。问题是一些提要提供者在同一提要的多个频道中发布完全相同的文章。因此,用户最终会获得同一篇文章的 2 个以上版本。我想保留所有文章,以防用户取消订阅包含一个副本但仍订阅另一个具有重复的频道的频道,但我只想在可用文章列表中显示一篇文章。
为了识别重复项,我创建了文章文本内容的哈希值,并将其作为属性存储在 Core Data 中的文章实体上 (text_hash)。我最初的想法是,我将能够制作一个获取请求,该请求可以基于此属性上的唯一匹配来获取文章,类似于 SQL 查询。事实证明并非如此(当时我只是在学习 Core Data)。
所以要破解一个解决方案,我获取所有文章,我创建一个空集,我枚举获取结果,检查哈希是否在集合中。如果是,我忽略它,如果不是,我将它添加到集合中,并将文章 ID 添加到数组中。完成后,我会根据文章 ID 创建一个谓词并进行另一次提取。
这看起来真的很浪费和笨拙,我不仅要获取两次并枚举结果,而且由于最终谓词是基于单个文章 id 的,因此每次添加新文章时都必须重新运行它。
它现在可以工作,但我要开发这个应用程序的新版本,如果可能的话,我想把它做得更好。任何帮助表示赞赏,谢谢!
【问题讨论】:
-
您的数据中是否有任何属性与重复项相同?假设您有 Article.name,所有重复项都相同吗?
-
如果 text_hash 相同,它们被认为是相同的,所以是的,我有一个属性 Article.text_hash,这就是我用来测试重复项的属性
-
因此,如果你有这个,你可以只获取一个带有该哈希的对象。但你可能想摆脱其他东西?
-
我想要做的是获取所有具有相同 channel_id 但只有一个版本的每篇文章有重复的文章。问题是没有办法制作一个像 SQL 一样起作用的谓词。在 SQL 中,我只需要执行类似“select * from article where channel_id = 5 group by text_hash”之类的操作,我就会得到我想要的。
-
你可能会使用 NSCompoundPredicate。
标签: ios core-data nspredicate nsfetchrequest