【问题标题】:CoreData getting objects based on a distinct propertyCoreData 基于不同的属性获取对象
【发布时间】: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


【解决方案1】:

你可以像这样使用propertiesToGroupBy

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

【讨论】:

  • 切换到NSDictionaryResultType 是这里的关键;它为NSFetchRequest 增加了大量的灵活性,包括havingPredicate:' and specifying custom expressions. Matt Connolly has an example of counting and grouping that you should take a look at if you're new to NSDictionaryResultType 的力量:mattconnolly.wordpress.com/2012/06/21/…
  • @JCS007:实际上我在问了这个问题后正在四处寻找,我遇到了 propertiesToGroupBy。但我必须改用字典而不是文章实体。我有几个表视图和许多使用文章实体的方法,我没有时间重写我所有的方法来适应这个版本的变化。我希望我在开始的时候就知道这一点……我想这是我现在必须忍受的唯一方式。感谢您的回复,我会记住这一点!
  • @HalMueller:感谢您的链接!这将有助于今晚阅读......
  • 很高兴这有帮助!也许不是重写所有这些方法,您可以有一个在设定时间运行的重复数据删除方法,以便清除重复项。只是一个想法。 :)
  • 实际上,既然你提到了它,我需要保留重复的内容,以防用户取消订阅一个频道而不是另一个(可能包含重复),但我可以标记重复并使用它在 fetch 谓词中,然后如果我删除具有重复项的文章,请删除标志...我什至不必使用 group by...我将不得不考虑更多。
猜你喜欢
  • 2011-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-05
  • 2016-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多