核心数据父实体
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 没有错。即使是抽象的父母也应该这样做。以上是关于核心数据父实体的主要内容,如果未能解决你的问题,请参考以下文章
如何在“详细”实体视图中为“主/父”实体“保存”(核心数据)?