2011-12-08 180 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