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 一起使用

NSPredicate 的使用

使用 NSPredicateEditor 编辑 NSPredicate

使用 NSPredicate 搜索 NSArray

NSPredicate 与具有多个对象的 Array 一起使用

NSPredicate - 使用两个条件进行评估