复杂的NSPredicates:比较最新对象的值

时间:2012-12-20 00:22:30

标签: ios core-data nspredicate

我有一个复杂的谓词,我正在努力解决。

基本上,我有一个Student对象。学生有testScoreObjects。 TestScoreObject具有scoreDate(NSDate)和score(NSNumber)等属性。

我想要一份学生名单,其中最近(按scoreDate)TestScoreObject的得分大于n。

理想情况下,在NSFetchedResultsController上实现这一点非常棒。

我知道如何通过遍历所有学生来以编程方式完成此操作,但我想知道这是否可以使用谓词,因此我可以保留使用FetchedResultsController的所有好处。

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

我会使用以下谓词:

NSString *format = @"SUBQUERY(testScoreObjects, $each, $each.score > $n && $each.scoreDate == testScoreObjects.@max.scoreDate)[SIZE] > 0";
NSDictionary *substitutions = @{@"n": @3}; // 3 is the value for n
NSPredicate *predicate = [[NSPredicate predicateWithFormat:format] predicateWithSubstitutionVariables:substitutions];

NSString *format = @"ANY SUBQUERY(testScoreObjects, $each, $each.score > $n).scoreDate == testScoreObjects.@max.scoreDate";
NSDictionary *substitutions = @{@"n": @3}; // 3 is the value for n
NSPredicate *predicate = [[NSPredicate predicateWithFormat:format] predicateWithSubstitutionVariables:substitutions];

两者都能正确过滤数组,但我没有测试过CoreData是否能够将它们转换为SQL(因此它可以与获取请求一起使用)。

当处理大型商店时,第二个谓词应该更有效率(据我所知),因为testScoreObjects.@max.scoreDate每个学生只评估一次。当然,实际结果可能会有所不同。

答案 1 :(得分:0)

当涉及到对象图时,子查询实际上是一个SQL继承的拐杖。我想你可以不用那样做。看看事情是多么简单:

[NSPredicate predicateWithFormat:
     @"ANY testScores.scoreDate > %@", cutoffDate];