2012-11-02 131 views
8

我想出了一個使用子查詢的解決方案,但我不明白爲什麼我先試圖做的沒有工作。核心數據,NSPredicate,任何key.path ==無

這是我的數據模型。我正在閱讀建議。

enter image description here

我可以做以下的斷言:

[NSPredicate predicateWithFormat:@"ANY conditions.terrain == %@", aTerrainObject]; 

工作正常,並返回任何忠告,其中的條件中的至少一個具有地形類型。

然而,當我嘗試這樣做,它失敗:

[NSPredicate predicateWithFormat:@"ANY conditions.terrain == nil"]; 

我想要做的是返回任何忠告,其中的至少一個條件不具備地形類型集。

但是,下列情況工作:

[NSPredicate predicateWithFormat:@"SUBQUERY(conditions, $x, $x.terrain == nil)[email protected] > 0"]; 

任何人能解釋爲什麼,零搜索時,我不能使用ANY語法?

+0

好點。 + 1 –

回答

24

任何人都可以解釋爲什麼,當搜索零,我不能使用任何語法?

是的!這是發生了什麼。

[NSPredicate predicateWithFormat:@"ANY conditions.terrain == nil"]; 

首先,讓我們打破這種成相應的左側和右側的表達式:

conditions.terrain 

這將通過採取SELF對象(Advice實例),並請valueForKeyPath:@"conditions.terrain"進行評估。這個keypath的結果將是一個集合。你基本上做:

Advice *a = ...; 
NSSet *conditions = [a conditions]; 
NSSet *terrains = [conditions valueForKey:@"terrain"]; 

所以,你有(潛在)Terrain實例的集合。現在,我們對Objective-C中的集合瞭解多少?一件事,他們不能包含nil。它們只能包含對象。這意味着當它執行謂詞的ANY部分時,它將遍歷數組中的項目並查看它們中沒有一個是nil

因此,您的謂詞失敗。我試着玩一些其他的變化(使用[NSNull null]而不是nil等),但沒有一個似乎工作。

因此,看起來您使用SUBQUERY來解決這個問題就像你可以得到的那樣好。我強烈建議filing a bug詳細說明你的期望,並表達你爲什麼認爲這應該工作。

+1

+1進行深入的解釋。 –

+0

優秀的回覆。感謝您徹底和準確。 –

0

我相信你不能在查詢中使用 nil。您應該使用 NULL或格式字符串結構,如 "ANY conditions.terrain == %@", nil

令我百思不解的是,你的子查詢的工作...

以上是不正確的,因爲NULLNIL可以互換使用。

取而代之的是,NSExpression Class Reference恰好給出了您的模式(使用@count)作爲首選示例。

您是否檢查過地形關係是否可選?

+0

是的,它是可選的。 –

相關問題