2012-02-13 54 views
0

上我有一個1 coredata數據模型:N的關係NSPredicate:加入對象或對象ID

Entity Item 
Tag *tag; 
.... 

Entity Tag 
NSString *name; 

我想獲取項目,女巫有標籤的關係。 以下工作:

Tag *selectedTag = ..... 
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Item"]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"tag.name = %@", selectedTag.name]; 

的問題是,有coud是具有相同名稱的多個標籤。 這些項目不應該被提取。

如何直接比較對象(selectedTag)或至少比較id。

兩個:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"tag == %@", selectedTag]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"[tag objectID] == %@", [selectedTag objectID] ]; 

不起作用。

謝謝

回答

1

這聽起來像你想要的標籤的反比關係。

如果美孚具有一對一關係標籤叫tagMember,其倒數爲標籤的一對多關係美孚稱爲fooMembers,然後得到一組所有的Foo其tagMember是選擇的標籤,你會的此操作:

NSSet *setOfFoos = selectedTag.fooMembers; 

或者,如果你還沒有設立標記一個子類,因此不能使用點語法,你可以這樣做:

NSSet *setOfFoos = [selectedTag valueForKey:@"fooMembers"]; 

(換句話說,由於你已經有了我的物品與您正在查找的對象相關,您可以直接從該項目中獲取這些對象,而不是執行提取操作。)

+0

謝謝,但如何看起來NSPredicate這個「查詢」?我不想獲取標籤,也不想導航關係。沒有其他辦法嗎? – mica 2012-02-14 08:06:06

+0

澄清:我想在TableView中使用NSFetchedResultsController。對於大量的項目來說,這不是更好,而不是整個內存? – mica 2012-02-14 08:32:41

+0

您將使用fetchRequest初始化您的fetchedResultsController,以便在顯示錶之前填充表格。您不希望在該提取中請求特定的對象ID。如果你想一次只填充幾個標籤,你可以使用謂詞,比如'tag.name ==%@'。請參閱FRC類別參考「修改提取請求」。一旦表開始運行並且用戶選擇了一個標記,就可以從表委託方法中獲取選定的標記。在這一點上你不需要另一次獲取。 – Wienke 2012-02-14 12:50:11

0

對於與父代有關係的給定實體,可以使用依賴於孩子實體本身。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"tag == %@", selectedTag]; 

將此謂詞應用於父實體的NSFetchRequest。對於1:n關係,您應該得到一個包含0或1個父實體的結果集。