2011-06-13 94 views
30

假設我有一個核心數據模型,其中摘要實體稱爲「動物」。然後,我有許多其他實體繼承這個抽象實體:「獅子」,「狗」,「貓」等(我沒有開發動物園計劃,但這個比喻適用於我解釋的問題!)核心數據:提取請求中的抽象實體

我想知道的是:我可以通過這樣一次獲取「所有動物」:

NSFetchRequest *searchRequest = [[NSFetchRequest alloc] init]; 
[searchRequest setEntity:[NSEntityDescription entityForName:@"Animal" inManagedObjectContext:aContext]]; 

NSArray *matchedObjects = [aContext executeFetchRequest:searchRequest error:nil]; 

我理解上有NSEntityDescription方法來確定一個實體是否從另一個繼承。但是,是否有一種快速方法來獲取特定(抽象)類型的所有實體 - 在這種情況下,「動物」?

如果上述方法無效,那麼最有效的方法是什麼?謝謝!

回答

31

您可以絕對使用該方法。

從蘋果公司的Core Data Programming guide(滾動到文章的底部):

如果定義了實體繼承層次結構(見「實體繼承」),當您指定一個超級實體作爲實體一個獲取請求,請求返回超實體和子實體的所有匹配實例。在某些應用程序中,您可能指定超級實體爲抽象(請參閱「抽象實體」)。爲了獲取抽象實體的所有具體子實體的匹配實例,可以將用於提取規範的實體設置爲抽象實體。對於「抽象實體」中描述的域,如果您使用Graphic實體指定獲取請求,則獲取會返回Circle,TextArea和Line的匹配實例。

+0

謝謝! (我很抱歉缺少那部分文檔,幾個小時後,它們都開始一起運行。) – Bryan 2011-06-14 03:50:13

+0

[This](http://stackoverflow.com/a/6920736/832111)答案讓我相信「Entity繼承「並不是正確的選擇。 – 2013-08-18 19:45:51

+0

@ d.ennis這裏的問題是「我可以一次抓取所有的動物......」,而不是「我可以讓我的所有實體繼承我的模型中的一個」全局「抽象實體嗎?實體繼承有其合理的用途,它可以是非常有用的。濫用它可以使你很好地放棄這些優點。 – octy 2013-08-20 15:28:19

2

我做了類似的事情,但是那個實體並不抽象。這是一個標準實體(沒有實例),我提取的其他實體都來自該實體。我還沒有與抽象類試了一下,不過,看文檔看來,它可能無法:

Core Data Programming Guide

抽象的實體,您可以指定 實體是抽象的,是是,那 你不會創建任何實體 該實體。如果您有一個 實體,那麼您通常會創建一個實體摘要 ,這些實體都代表 專用化(從其繼承) 公用實體,該實體本身不應該自己 被實例化。例如,在 繪圖應用程序中,您可能有一個 圖形實體,它爲x和y座標,顏色和 繪圖邊界定義屬性 。然而,你永遠不會, 實例化一個圖形。 Graphic的子實體可能是 Circle,TextArea和Line。

我的建議是設置抽象的動物實體,並給它一個鏡頭。如果它不起作用,那麼就讓動物實體非抽象(詞語讓我失望,是我們稱之爲的嗎?也許'具體'更好?),你應該沒問題。如果有人用抽象類來做這件事,我會聽到它的。