2012-12-20 64 views
2

我有一個複雜的謂詞,我正在努力解決。複雜的NSPredicates:比較最近對象上的值

基本上,我有一個Student對象。學生有testScoreObjects。 TestScoreObject具有諸如scoreDate(NSDate)和分數(NSNumber)之類的屬性。

我想要列出最近(按scoreDate)TestScoreObject的得分大於n的學生。

理想情況下,完成這將是一件好事,這是NSFetchedResultsController上的一個NSPredicate。

我知道如何以編程方式完成所有學生的學習,但我想知道這是否可以做一個謂詞,這樣我就可以保留擁有FetchedResultsController的所有好處。

感謝您的幫助!

回答

1

我會用以下謂詞:

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]評價每個學生只有一次。當然,實際結果可能會有所不同。

+0

感謝您的建議。那些在過濾數組時確實有效,但Core Data真的不喜歡@max。哦,我們會找到另一種方式! –

0

當涉及到對象圖時,子查詢實際上是一個SQL繼承的柺杖。我想你可以沒有這個。看看如何簡單的事情可以是:

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