2012-08-26 108 views
0

我有以下模型圖:核心數據跨越一對一的關係取請求謂詞濾波

    +-----------+  +-----------+ 
        | Container |  | Group | 
        +-----------+  +-----------+ 
        | groups |<-->>| container | 
        +-----------+  +-----------+ 
         ^    ^
         |     | 
+-----------+  +-----------+  +-----------+  +---------+ 
| Owner |  | ToyBox |  | ToyType |  | Item | 
+-----------+  +-----------+  +-----------+  +---------+ 
| toyBox |<--->| owner |  | items |<-->>| toyType | 
+-----------+  +-----------+  +-----------+  +---------+ 

在一個UITableView我顯示一個列表中的項目的列表。在這種情況下,我只想顯示屬於特定所有者的物品。爲此,我將使用NSFetchedResultsController來顯示項目。這意味着我需要創建一個NSFetchRequest和一個適當的NSPredicate以提供給NSFetchedResultsController。

嘗試使用鍵路徑謂詞會導致由父實體造成的異常。這似乎是Apple的錯誤或不支持的決定。雷達已經提交。另外,我不希望扁平化這些實體。

所以這給我留下了試圖與SUBQUERY做到這一點()如下:

NSFetchRequest *itemsFetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Item"]; 
NSPredicate *itemsPredicate = [NSPredicate predicateWithFormat:@"SUBQUERY(toyItem, $g, SUBQUERY($g.container, $c, SUBQUERY($c.owner, $o, $o = %@)[email protected] > 0)[email protected] > 0)[email protected] > 0", ownerObject]; 

這將導致以下異常:

Can't have a non-relationship collection element in a subquerySUBQUERY($c.owner, $o, $o == <MLMOOwner: ... 

我意識到,因爲這種關係是一個所有者和玩具箱之間沒有收集的集合,這就是問題所在。所以我的問題是:

1)有沒有辦法強制在子查詢中返回一對一關係的集合?
2)如果沒有另外一種方法去創建這個謂詞的獲取請求?

回答

2

似乎它應該是很簡單的做你想做的事情。如果您希望給定所有者的所有項目,請從所有者開始,並使用關鍵路徑獲取關聯的項目。你不需要謂詞。如果你有10罐花生,而你想用罐子2取出花生,那麼你不是從一套花生開始,然後根據他們的罐子過濾它們,對吧?你首先得到罐子2,然後你看看它包含的花生。所以這樣做:

NSSet *groups = [ownerObject valueForKeyPath:@"toyBox.groups"]; 

這給你擁有的所有組ownerObject。因爲Group實體沒有items屬性,所以不能只使用單個鍵路徑獲取所有項目。通過給予Group訪問者,即使它只返回一個空集,您也可以使自己的生活更輕鬆。這將讓你這樣做:

NSSet *items = [ownerObject valueForKeyPath:@"toyBox.groups.items"]; 

如果你不想一個items屬性添加到Group,你必須從第一例過濾集groups挑出只是那些ToyType對象對象。然後,您可以使用該設置上的鍵路徑@"items"來獲取所需的項目列表。

你必須小心實體繼承。你剛纔看到它是如何使得獲取更復雜一點。它也會影響您的數據存儲方式,即all instances of sub-entities are stored in the same table。因此,如果您有來自Group(如ToyType)的一打實體,則所有這些實體的所有實例都將一起存儲。

+0

你甚至可以離開SELF。出。 –

+0

@Scott好點。 – Caleb

+0

@Caleb感謝您的反饋。我實現的第一件事是一個關鍵路徑方法,我也有一個例外。我只是試了一遍,下面回來:'keypath group.container。所有者未在實體中找到' –