【问题标题】:Core Data: Abstract Entity in Fetch Request核心数据:获取请求中的抽象实体
【发布时间】:2011-09-13 17:52:46
【问题描述】:

假设我有一个核心数据模型,其中包含一个名为“Animal”的抽象实体。然后,我有许多其他实体继承自这个抽象实体:“Lion”、“Dog”、“Cat”等。(我不是在开发动物园程序,但这个类比适用于我正在解释的问题!)

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

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

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

我知道 NSEntityDescription 上有一些方法可以确定一个实体是否继承自另一个实体。但是有没有一种快速的方法来获取特定(抽象)类型的所有实体——在这种情况下是“动物”?

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

【问题讨论】:

    标签: objective-c cocoa macos core-data


    【解决方案1】:

    您可以绝对使用这种方法。

    来自苹果的Core Data Programming guide

    实体继承的工作方式与类继承类似;并且出于同样的原因很有用。如果您有许多相似的实体,您可以将公共属性分解为一个超实体,也称为父实体。您可以在一个实体中定义它们,而子实体继承它们,而不是在多个实体中指定相同的属性。例如,您可以定义具有属性 firstName 和 lastName 的 Person 实体,以及继承这些属性的子实体 Employee 和 Customer。

    【讨论】:

    • 谢谢! (我很抱歉错过了那部分文档。几个小时后,它们都开始一起运行。)
    • This 的回答让我相信“实体继承”不是正确的选择。
    • @d.ennis 这里的问题是“我可以一次获取“所有动物”...”,而不是“我可以让我的所有实体都继承自模型中的一个“全局”抽象实体吗”。实体继承有它的合理用途,它非常有用。滥用它会让你失去这些优势。
    • @octy 链接坏了
    • @Mick 谢谢,我更新了答案以反映 developer.apple.com 上发布的当前文档
    【解决方案2】:

    我做过类似的事情,但是那个实体不是抽象的。这是一个标准实体(没有实例),我获取的其他实体都是从该实体派生的。我没有尝试过抽象类,但是,查看文档似乎不可能:

    Core Data Programming Guide

    抽象实体你可以指定 一个实体是抽象的——也就是说, 你不会创建任何实例 那个实体。你通常会做一个 如果您有数字,则实体摘要 所有代表的实体 (继承自)a的特化 本身不应该的共同实体 被实例化。例如,在一个 你可能有一个绘图应用程序 定义属性的图形实体 对于 x 和 y 坐标、颜色和 绘制界限。不过,你从来没有, 实例化一个图形。具体的 Graphic 的子实体可能是 圆形、文本区域和线条。

    我的建议是使用抽象的 Animal 实体进行设置并试一试。如果它不起作用,那么只需将 Animal 实体设置为非抽象(单词让我失望,我们会这么称呼它吗?也许“具体”更好?)你应该没问题。如果有人用抽象类做到了这一点,我会听到的。

    【讨论】:

    • 链接失效
    【解决方案3】:

    是的,我相信您可以一次获取所有动物。

    来自核心数据编程指南:

    实体继承

    如果您在 Core Data 中指定父实体作为 Core Data 获取请求的实体,获取返回匹配 实体和子实体的实例(请参阅获取对象)。作为一个 推论,如果您将父实体指定为 由 Core Data 支持的控制器,它获取匹配的实例 实体和任何子实体。如果您指定一个抽象父级 实体,核心数据支持的控制器获取匹配的实例 具体的子实体。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-01
      • 1970-01-01
      • 2018-02-11
      • 2019-11-06
      相关资源
      最近更新 更多