CoreData获取基于不同属性的对象
我有一段时间的问题,我一起砍了一个解决方案,但我正在重温它,希望找到一个真正的解决方案。不幸的是,这并没有发生。在核心数据中,我有很多RSS文章。用户可以订阅单个Feed中的单个频道。问题在于某些Feed提供商在同一Feed的多个频道中发布完全相同的文章。所以用户最终得到同一篇文章的2+版本。我希望保留所有文章,以防用户退订包含一个副本但仍保留订阅另一个频道的副本,但我只想在可用文章列表中显示单个文章。CoreData获取基于不同属性的对象
为了识别重复项,我创建了文章文本内容的哈希值,并将其作为属性存储在Core Data(text_hash)中的Article实体上。我原来的想法是,我将能够制作一个获取请求,该请求可以基于此属性上的唯一匹配获取文章,如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];
切换到'NSDictionaryResultType'是这里的关键;它为'NSFetchRequest'增加了很多灵活性,包括'havingPredicate:'和指定自定义表达式。马特康诺利有一个计数和分组的例子,你应该看看如果你是新的'NSDictionaryResultType'的力量:http://mattconnolly.wordpress.com/2012/06/21/ios-core-data -group-by-and-count-results/ –
@ JCS007:其实我在问这个问题后四处搜寻,并且遇到了propertiesToGroupBy。但是我必须转而使用字典而不是条款实体。我有几个表格视图和很多使用Article实体的方法,我没有时间重新编写所有方法来适应此版本的更改。我希望当我开始的时候我就知道这件事......我想如果这是我必须忍受现在我所拥有的唯一方式。感谢您的回应,我将在未来记住这一点! – d370urn3ur
@HalMueller:感谢您的链接!这将使今晚有一些很好的阅读... – d370urn3ur
你有你的数据的属性,它是重复的一样吗?假设你有Article.name,对于所有重复项都是一样的吗? – Mikael
如果text_hash是相同的,那么他们被认为是相同的,所以是的,我有一个属性Article.text_hash,这就是我用来测试重复的东西 – d370urn3ur
所以如果你有,你可以用这个散列来获取一个对象。但是你可能想要摆脱其他的东西? – Mikael