2011-06-13 95 views
30

假设我有一个核心数据模型,其中摘要实体称为“动物”。然后,我有许多其他实体继承这个抽象实体:“狮子”,“狗”,“猫”等(我没有开发动物园计划,但这个比喻适用于我解释的问题!)核心数据:提取请求中的抽象实体

我想知道的是:我可以通过这样一次获取“所有动物”:

NSFetchRequest *searchRequest = [[NSFetchRequest alloc] init]; 
[searchRequest setEntity:[NSEntityDescription entityForName:@"Animal" inManagedObjectContext:aContext]]; 

NSArray *matchedObjects = [aContext executeFetchRequest:searchRequest error:nil]; 

我理解上有NSEntityDescription方法来确定一个实体是否从另一个继承。但是,是否有一种快速方法来获取特定(抽象)类型的所有实体 - 在这种情况下,“动物”?

如果上述方法无效,那么最有效的方法是什么?谢谢!

回答

31

您可以绝对使用该方法。

从苹果公司的Core Data Programming guide(滚动到文章的底部):

如果定义了实体继承层次结构(见“实体继承”),当您指定一个超级实体作为实体一个获取请求,请求返回超实体和子实体的所有匹配实例。在某些应用程序中,您可能指定超级实体为抽象(请参阅“抽象实体”)。为了获取抽象实体的所有具体子实体的匹配实例,可以将用于提取规范的实体设置为抽象实体。对于“抽象实体”中描述的域,如果您使用Graphic实体指定获取请求,则获取会返回Circle,TextArea和Line的匹配实例。

+0

谢谢! (我很抱歉缺少那部分文档,几个小时后,它们都开始一起运行。) – Bryan 2011-06-14 03:50:13

+0

[This](http://stackoverflow.com/a/6920736/832111)答案让我相信“Entity继承“并不是正确的选择。 – 2013-08-18 19:45:51

+0

@ d.ennis这里的问题是“我可以一次抓取所有的动物......”,而不是“我可以让我的所有实体继承我的模型中的一个”全局“抽象实体吗?实体继承有其合理的用途,它可以是非常有用的。滥用它可以使你很好地放弃这些优点。 – octy 2013-08-20 15:28:19

2

我做了类似的事情,但是那个实体并不抽象。这是一个标准实体(没有实例),我提取的其他实体都来自该实体。我还没有与抽象类试了一下,不过,看文档看来,它可能无法:

Core Data Programming Guide

抽象的实体,您可以指定 实体是抽象的,是是,那 你不会创建任何实体 该实体。如果您有一个 实体,那么您通常会创建一个实体摘要 ,这些实体都代表 专用化(从其继承) 公用实体,该实体本身不应该自己 被实例化。例如,在 绘图应用程序中,您可能有一个 图形实体,它为x和y坐标,颜色和 绘图边界定义属性 。然而,你永远不会, 实例化一个图形。 Graphic的子实体可能是 Circle,TextArea和Line。

我的建议是设置抽象的动物实体,并给它一个镜头。如果它不起作用,那么就让动物实体非抽象(词语让我失望,是我们称之为的吗?也许'具体'更好?),你应该没问题。如果有人用抽象类来做这件事,我会听到它的。