2012-11-04 56 views
0

我有它由NSManagedObjects和被建模日曆時期的一個NSArray如圖這個屏幕截圖比較對象:謂詞與同一集合中的每個其它對象

endMonth = 9; 
endYear = 2012; 
length = 3; 
... 

我所試圖做的事:

我正在嘗試構造一個謂詞,它只返回那些一年前的同等時期存在的日曆時期。示例:僅當數組中存在句點2011, 9, 3時,才返回期間2012, 9, 3(年,月,長)。謂詞需要將每個日曆週期與數組中的每個日曆週期進行比較。

這是我試過的斷言:

predicate = [NSPredicate predicateWithFormat: 
     @"SUBQUERY(SELF, $x, $x.endYear == endYear - 1 " 
     "AND $x.endMonth == endMonth AND $x.length = length)[email protected] > 0"]; 

問題:

但是,運行我的應用程序中出現錯誤消息運行時墜毀謂詞結果:NSInternalInconsistencyException」,原因:'無法執行集合評估與非集合對象。'

我的謂詞有什麼問題,我需要如何正確指定它?

謝謝!

+0

看看這個帖子在這裏: http://stackoverflow.com/questions/2822625/core-data-many-to-many-relationship-nspredicate – NSAddict

回答

1

首先,解決你所看到的錯誤。這是你的斷言:

[NSPredicate predicateWithFormat:@"SUBQUERY(SELF, $x, $x.endYear == endYear - 1 " 
    "AND $x.endMonth == endMonth AND $x.length = length)[email protected] > 0"] 

的第一個參數一個SUBQUERY表達是一家集其SUBQUERY將迭代。因此,您期望SELF可以評估爲NSArrayNSSet。然而,你的子查詢謂詞的keypaths endYearendMonthlength的使用似乎表明你希望SELF評價爲CalendarPeriod。因此,無論是SELF是一家集(和endYearendMonthlength是集合無效keypaths),或SELFCalendarPeriod(因此不能被用作SUBQUERY的集合。根據你的錯誤,似乎。是後者

如果我們寫你的問題了(不使用NSPredicate),我們很可能最終的東西是這樣的:

NSArray *calendarPeriods = ...; 
for (CalendarPeriod *period in calendarPeriods) { 
    for (CalendarPeriod *otherPeriod in calendarPeriods) { 
    if ([otherPeriod endYear] == [period endYear] - 1 && [otherPeriod endMonth] == [period endMonth] && [otherPeriod length] == [period length]) { 
     return YES; 
    } 
    } 
} 
return NO; 

那麼,如何複製這個.. 。

你最初的嘗試似乎很不錯。我認爲,需要做出的唯一的變化是,而不是SELF作爲第一個參數SUBQUERY,你應該使用%@calendarPeriods收集那裏的替代品。或者,如果您以NSFetchRequest的謂詞執行此操作,則可以嘗試使用FETCH()表達式來獲取每個CalendarPeriod對象。

順便說一下,如果沿着這條路線走,你會看到相當不好的表現。這是一個保證O(N ),你可以做得更好。例如,如果您將每個CalendarPeriod提取到內存中,然後將它們插入由endYear,endMonthlength的組合鍵入的NSDictionary,則可以將其縮減爲O(N)時間。

+0

感謝您非常全面的答覆,戴夫。我有兩個後續問題:1:當我用'SUBQUERY'中的'%@'替換'SELF'時,我需要指定什麼作爲獲取請求的參數(因爲'CalendarPeriod'是一個'NSManagedObject'我通過NSFetchRequest * request = [NSFetchRequest fetchRequestWithEntityName:@「CalendarPeriod」]''獲取。 2:我在哪裏可以找到關於您所建議的'FETCH()'表達式的更多信息。這個表達對我來說是非常新的。 – AlexR

相關問題