核心数据父实体

Posted

技术标签:

【中文标题】核心数据父实体【英文标题】:Core Data parent Entity 【发布时间】:2011-12-08 18:43:56 【问题描述】:

我有一个抽象实体 A,我还有两个实体,它们的父实体是实体 A。 每个孩子与其他实体的关系不同。

我正在尝试获取实体 A 的所有子实体,其 isPublic 布尔值为 YES。

过去,我在获取子类实体时遇到了与获取相关的问题,我确信我只是没有正确执行。

所以我们可以说例如: • 实体 A 是“文档”, • 实体 B 是“诗”, • 实体 C 是“物品”

所有诗歌和文章都是文档的子类,并且文档有一个名为 isBookmarked 的属性,用户可以为一首诗歌或文章添加书签,我需要一种获取所有已添加书签的文档的方法。实体 B 和 C 需要独立,因为它们拥有其他关系。

我想使用 NSFetchedResultsController 来获得最佳 Core Data 和 UITableView 性能,但我正在努力获取诗歌和文章的组合。

什么获取请求会给我带来诗歌和文章的混合?

【问题讨论】:

虽然子类化 NSManagedObject 是例行公事,但我从未听说过依次子类化 that 实体——至少在我有限的经验中没有。你真的需要这样做吗?难道你不能只有一个实体 Document,它有一个属性来识别文档的类型(比如一个 int,1 代表文章,2 代表诗歌,3 代表小说等)以及与其他文件的多对多关系,代表书签?然后,您的 fetchRequest 谓词可以根据 int 属性指定您想要的文档类型。 是的,我需要一个单独的实体,因为我与每个子实体都有关系,例如,注释可能引用用户,但文章可能引用新机构,而不是作者...只是一个例子 好吧,这里有一个建议可以做到的帖子,还有一些提示:[***.com/questions/4508451/…. 【参考方案1】:

如果你只是添加,Wienke 的答案应该可以工作

[request setIncludesSubentities:YES];

否则你只会收到A实体的结果,应该是非你所说的抽象的。

【讨论】:

嘿,谢谢。我可能不应该回答这个问题,但感谢更有经验的海报,我现在知道如何使用抽象 MO。 (对不起,丹尼尔,弄混了水。) @Daniel 这绝对是正确的答案,应该被接受。【参考方案2】:

像这样简单的东西怎么样(假设 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: 测试可能更有效。)

这行不通?

【讨论】:

不完全是 NSFetchedResultsController 但这是要走的路。使用 NSManagedObject 的父类创建 fetchRequest 没有错。即使是抽象的父母也应该这样做。

以上是关于核心数据父实体的主要内容,如果未能解决你的问题,请参考以下文章

核心数据模型级联删除和父实体

使用核心数据的父实体继承和反向关系

如何在“详细”实体视图中为“主/父”实体“保存”(核心数据)?

仅在父子实体具有 1 到 M 关系的核心数据中获取父实体的数据

核心数据中的父实体和关系

如何创建父实体和关系的核心数据模型