2008-11-18 164 views
4

假設我有一個層次結構的實體,Parent是根實體,ChildParent的子類。我想設置一個NSArrayController以僅提取Parent的實體,但不提取Child提取核心數據實體,但不提取子實體

如果您將Interface Builder中的陣列控制器的實體名稱設置爲Parent,則它將獲取所有ParentChild實體。我本來試圖在Interface Builder設置陣列控制器的獲取謂語:

entity.name == "Parent" 

這個工作對一個XML存儲,但是當我切換到一個SQLite存儲,它不再工作。我得到以下錯誤:

keypath entity.name not found in entity <NSSQLEntity xxx> 

由於周圍的工作,我在我的awakeFromNib建立一個過濾謂詞(與上述相同entity.name謂語)僅過濾父實體。顯然,謂詞在實體處於內存中時是有效的,但不能在SQL支持的謂詞謂詞中使用它。

有沒有辦法只提取Parent實體,但不是Child實體使用與SQLite存儲一起使用的提取謂詞?使用過濾器謂詞來拉入實體時,看起來很浪費。

回答

3

我嘗試使用includesSubentities,但它最終沒有完全工作。原來,如果您將「自動準備內容」設置爲「是」,從而繞過自定義提取謂詞,則子實例的更改會導致數組控制器的內容在未執行提取的情況下得到更新。回溯顯示setContent:被響應於MOC通知而被調用。

我發現可靠地做到這一點的唯一方法是使用過濾器謂詞。

+0

除了上面Dave Dribin的回答之外,還要確保將clearsFilterPredicateOnInsertion設置爲NO,以便在您插入或刪除某些內容時您的過濾器不會被清除(您可以在代碼或IB中執行此操作) 。 – StevenO 2014-02-28 15:59:38

7

爲了達到此目的,Leopard將includesSubentities屬性引入NSFetchRequest。您必須繼承您的NSObjectController或NSArrayController以提供將通過其defaultFetchRequest屬性使用的獲取請求,或者通過覆蓋其-fetchWithRequest:...方法來更改其使用的獲取請求。