2011-05-14 56 views
28

我不確定如何將幾個條件「層疊」到NSPredicate中。配置多個條件的NSPredicate

我對Core Data相當陌生,並不確定這是否是實現我所期望的目標的正確方法。

這裏是我想要做的事:

有是有一個Location對象,其中有photosTookThere的逆一個whereTook關係的照片對象。

該照片又有一個名爲isFavourite的NSNumber屬性。

我想配置一個NSFetchRequest,它將首先檢查photosTookThere是否存在,如果是,請檢查每個生成的Photo對象並只返回設置爲收藏夾的那些對象。

這裏是到目前爲止的代碼:

request.entity = [NSEntityDescription entityForName:@"Location" inManagedObjectContext:context]; 
request.sortDescriptors = [NSArray arrayWithObject[NSSortDescriptorsortDescriptorWithKey:@"locationId" ascending:YES]]; 
request.predicate = [NSPredicate predicateWithFormat:@"[email protected] != 0"]; 

我怎麼會級聯第二個條件到謂語和返回正確的結果?

回答

61

只需將每個條件放在圓括號內,並用AND連接即可。

[NSPredicate predicateWithFormat:@"([email protected] != 0) AND (isFavourite == %@)", [NSNumber numberWithBool:YES]]; 

我也建議改變你的「whereTook」關係「定位」這個名字,而你的「photosTookThere」簡單的「照片」,這是更符合慣例一致。

+0

謝謝,我將爲將來考慮關於約定的評論 - 我是Core Data的新手。 我仍然有一個問題,雖然: 2011-05-15 17:52:24.346 CL位置[14321:207] ***終止應用程序由於未捕獲的異常'NSInvalidArgumentException',原因:'keypath isFavourite不是找到實體' 我猜這是因爲isFavourite是在Photo對象上,而不是位置。 photosTook有一個NSSet。我如何說出這是一個NSSet的謂詞,並且應該在集合中的每個成員上檢查是否應該使用Favourite? – Will 2011-05-15 16:53:34

+0

我明白了。是的問題是,一個參數是用於位置,另一個用於照片。我認爲你的關係命名讓我感到困惑。如果我理解正確,那麼你將獲取照片,所以你的NSEntityDescription應該反映這一點。你想要做的是讓你查詢的位置對象。然後,您可以將謂詞更改爲@「(whereTook ==%@)AND(isFavourite ==%@)」,[self location],[NSNumber numberWithBool:YES]。將[自己的位置]替換爲您擁有位置對象的任何位置。希望這可以幫助。 – 2011-05-15 22:56:28

+0

謝謝;仍然有一些麻煩,但我會做一些額外的背景閱讀,以防萬一我失去了一些非常明顯的東西。我甚至可能會重新命名這些關係,以便它們符合適當的慣例。 – Will 2011-05-17 22:21:05

6

您可以非常簡單地在謂詞中使用AND和OR,就像在SQL語句中指定「where」條件一樣。要檢查NULL,看起來像你想要比較「whereTook」時,你可以比較爲零(whereTook =零)。

+0

你的意思(whereTook ==無)。否則它是一項任務。 – katzenhut 2013-09-10 08:01:38

+1

@katzenhut一個'''=''是謂詞/ SQLite的有效條件。 – 2014-11-06 01:07:34

8

我最終能夠解決這個使用子查詢:

request.predicate = [NSPredicate predicateWithFormat: 
         @"([email protected] !=0) AND SUBQUERY(photosTookThere, $Photo, $Photo.isFavourite==1)[email protected] >0" 
         ];