2010-09-09 50 views
5

假設我有一個類型爲「obj」的核心數據對象,該對象具有屬性「propertyA」,並且與具有兩個屬性「propertyB」和「propertyC」的「sub」類型的對象具有一對多關係。如何使用NSPredicate過濾核心數據關係?

我想獲取所有的屬性propertyA等於一個值和一個子物件propertyB和propertyC設置的objs。

如果這只是propertyA和propertyB,我會做

[NSPredicate predicateWithFormat:@"ANY sub.propertyB = %@ AND propertyA == %@", ...]; 

的問題是,我無法弄清楚如何在第二個屬性添加。我只想要具有至少一個具有兩個屬性的sub的objs。我試過以下,但它不起作用:

[NSPredicate predicateWithFormat:@"ANY (sub.propertyB = %@ AND sub.propertyC) AND propertyA == %@", ...]; 

我試過它沒有任何,但那也行不通。我怎樣才能做到這一點?

回答

7

由於您與子對象之間存在多對多關係,因此的subs屬性將返回一個集合而不是單個對象。要查詢該集合,您需要使用SUBQUERY。

子查詢的格式如下:

SUBQUERY(collection, $individualCollectionItem, expression-with-collection-item) 

在這種情況下,你會希望像

SUBQUERY(subs,$s,$s.propertyB==%@) AND SUBQUERY(subs,$s,$s.propertyC!=NULL) 
+0

謝謝,但我找不到在任何蘋果文檔中有關SUBQUERY的任何信息。如果我使用它,我的應用程序是否會被蘋果商店拒絕? – Mike 2010-09-12 22:18:42

+0

我無法獲得SUBQUERY工作。我的原始預測是: – Mike 2010-09-12 22:30:41

+0

NSPredicate * predicate = [NSPredicate predicateWithFormat:@「isdeleted == NO and ANY appuserMessages.recAppUserID ==%@」,appuserid]; – Mike 2010-09-12 22:31:24

4

的解決方案似乎是:

[NSPredicate predicateWithFormat:@"propertyA == %@ AND (SUBQUERY(sub, $s, $s.propertyB == %@ AND $s.propertyC == %@)[email protected] != 0)", propertyAvalue, propertyBvalue, propertyCvalue]; 

,其中在最後的值是您希望各種屬性相等的值。