我有一个复杂的断言要尝试。
基本上,我有一个Student对象。学生有testScoreObjects。 TestScoreObject具有诸如scoreDate(NSDate)和score(NSNumber)之类的属性。
我想要一个学生列表,这些学生的最新(按scoreDate)TestScoreObject的得分大于n。
理想情况下,最好在NSFetchedResultsController上使用一个NSPredicate来完成此操作。
我知道如何通过遍历所有学生来以编程方式完成此任务,但是我想知道是否可以通过谓词来完成此任务,因此我可以保留拥有FetchedResultsController的所有好处。
感谢您提供的所有帮助!
最佳答案
我将使用以下谓词:
NSString *format = @"SUBQUERY(testScoreObjects, $each, $each.score > $n && $each.scoreDate == [email protected])[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 == [email protected]";
NSDictionary *substitutions = @{@"n": @3}; // 3 is the value for n
NSPredicate *predicate = [[NSPredicate predicateWithFormat:format] predicateWithSubstitutionVariables:substitutions];
两者都可以正常工作以过滤数组,但是我还没有测试CoreData是否能够将它们转换为SQL(因此可以与提取请求一起使用)。
当处理大型商店时,第二个谓词应该更有效(据我所知),因为
[email protected]
每个学生仅被评估一次。当然,实际结果可能会有所不同。