NSPredicate 使用 RLMResults 作为参数
Posted
技术标签:
【中文标题】NSPredicate 使用 RLMResults 作为参数【英文标题】:NSPredicate using RLMResults as an argument 【发布时间】:2015-01-03 21:29:43 【问题描述】:我试图通过使用 NSPredicate 进行过滤来获取两组 Realm 数据(并且是不同的对象)之间的差异,但是出现了一个我无法理解的错误。我的代码:
RLMResults *topStories = [KFXTopStory allObjects];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NONE threadId = %@.topStoryId", topStories];
RLMResults *objectsToDelete = [KFXThread objectsWithPredicate:predicate];
错误:
*** Terminating app due to uncaught exception 'Invalid predicate', reason: 'Predicate with ANY modifier must compare a KeyPath with RLMArray with a value'
查询似乎表明必须将键路径与值进行比较,而不是与另一个键路径进行比较。 Realm 甚至可以进行这种类型的查询吗?它看起来应该是,所以我哪里错了?对此的任何帮助或更好的解决方案都会很棒 - 谢谢!
编辑:
当然,在我发布这个之后,我得到了一些有用的东西。但我仍然想知道是否有更好的方法。工作代码:
RLMResults *topStories = [KFXTopStory allObjects];
NSMutableArray *topStoryIds = [[NSMutableArray alloc] initWithCapacity:100];
for (KFXTopStory *story in topStories)
[topStoryIds addObject:story.topStoryId];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT (threadId IN %@)", topStoryIds];
RLMResults *objectsToDelete = [KFXThread objectsWithPredicate:predicate];
【问题讨论】:
使用 NSSet 而不是 Array(对订购的产品进行重复数据删除)可能会更快,但否则您的解决方案是目前最好的。 (类似于***.com/questions/27728575/…)。 【参考方案1】:使用 NSSet 而不是 Array(对订购的产品进行重复数据删除)可能会更快,但否则您的解决方案是目前最好的。 (类似于realm cocoa: predicate to select items not related)。
【讨论】:
以上是关于NSPredicate 使用 RLMResults 作为参数的主要内容,如果未能解决你的问题,请参考以下文章
NSPredicate 101:将 NSPredicate 与自定义对象的 NSMutableArray 一起使用
使用 NSPredicateEditor 编辑 NSPredicate