2011-12-08 181 views
4

我有一個抽象的實體A,我也有兩個實體,他們的父母是實體A. 每個孩子與其他實體有不同的關係。核心數據父實體

我想獲取實體A的所有子實體,誰是isPublic布爾值是YES。

我在取回過去取得子類實體時遇到了麻煩,而且我確信我只是沒有正確地做。

因此,我們可以說,例如說: •實體A的「一號文件」, •實體B是「詩」, •實體C是「物品」

所有的詩篇和文章子文檔,文檔有一個名爲isBookmarked的屬性,suer可以爲詩或文章添加書籤,並且我需要一種獲取所有書籤文檔的方法。實體B和C需要獨立,因爲它們擁有的其他關係。

我想使用NSFetchedResultsController來獲得最佳的Core Data和UITableView性能,並且我正在努力獲取詩歌和文章的組合。

什麼取回請求會給我一個詩歌和文章的組合?

enter image description here

+0

雖然NSManagedObject的子類是例程,但我從來沒有聽說過*實體的子類化 - 至少在我有限的經驗中沒有。你真的需要這樣做嗎?難道你不能只擁有一個實體文檔,有一個屬性來識別文檔的類型(比如文章中的1,文章中的2,小說中的3等)以及與其他文檔的多對多關係,代表書籤?然後,您的fetchRequest謂詞可以指定每個int屬性需要哪種類型的文檔。 – Wienke

+0

是的,我需要一個單獨的實體,因爲我與每個子實體有關係,例如一個筆記可以引用一個用戶,但一篇文章可能引用一個新的代理,而不是作者......只是一個例子 – Daniel

+0

嗯,這裏是一個建議可以完成的帖子,有一些提示:[http://stackoverflow.com/questions/4508451/core-data-inheritance-is-it-ok-to-do-this]。 – Wienke

回答

4

如何像這樣簡單的東西(即假設isBookmarked是一個布爾值):

NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Document" inManagedObjectContext:context]; 
// This may not be the most elegant way of using a boolean in a predicate, but… 

NSNumber *numIsBookmarked = [NSNumber numberWithBool:YES]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"isBookmarked == %@", numIsBookmarked]; 
NSFetchRequest *request = [[NSFetchRequest alloc] init]; 

[request setEntity: entityDescription]; 
[request setPredicate: predicate]; 
[request setResultType: NSManagedObjectResultType]; 

NSError *error = nil; 
NSArray *results = [contextMain executeFetchRequest:request error:&error]; 

if (error) 
{ 
    // deal with the error 
} 

[request release]; 

後,你會檢查其子類是牽強:

for (NSManagedObject *obj in results) 
{ 
    if ([obj isKindOfClass:[Poem class]]) 
    { 
     // do whatever 
    } 
    else if ([obj isKindOfClass:[Article class]]) 
    { 
     // do whatever 
    } 
} 

(或者,如果幾個子類別的MO實施相同的方法,那麼執行respondsToSelector:測試可能更有效。)

這不起作用?

+0

不完全是NSFetchedResultsController,但這是要走的路。用NSManagedObject的父類創建fetchRequest沒什麼問題。即使是抽象的父母也應該做 –

5

Wienke的答案應該工作,如果你只需要添加

[request setIncludesSubentities:YES]; 

否則你只會收到在A實體,就像你說的是抽象的應該是無結果。

+1

嘿,謝謝。我可能不應該在這個問題上跳槽,但是由於更有經驗的海報,我現在知道如何使用抽象的MOs。(對不起,丹尼爾,因爲混濁的水。) – Wienke

+0

@丹尼爾這絕對是正確的答案,應該被接受。 – Joe