【问题标题】: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 属性指定您想要的文档类型。
  • 是的,我需要一个单独的实体,因为我与每个子实体都有关系,例如,注释可能引用用户,但文章可能引用新机构,而不是作者...只是一个例子
  • 好吧,这里有一个建议可以做到的帖子,还有一些提示:[stackoverflow.com/questions/4508451/….

标签: ios cocoa-touch core-data


【解决方案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 没有错。即使是抽象的父母也应该这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-12
  • 2011-10-18
  • 2012-05-09
  • 1970-01-01
  • 2016-06-04
  • 1970-01-01
相关资源
最近更新 更多