【问题标题】:Core Data - to-many relationship with sub-entities, with inverse in the abstract entity?核心数据 - 与子实体的多对多关系,在抽象实体中具有反向关系?
【发布时间】:2014-05-13 16:07:29
【问题描述】:

this question类似或可能相关。

假设我有一个对象类“动物园”。它与(抽象)类型“动物”的对象具有一对多的关系。因此,Animal 属于 Zoo 对象,具有“zoo”属性,而 Zoo 对象具有“animals”属性。

但是,我通常对具体的子实体更感兴趣,例如 Giraffe 或 Monkey。

我想要一个名为“giraffes”和“monkeys”的关系属性,还有“animals”属性。我想创建 Giraffe 对象并将它们添加到 Zoo。

这将如何工作?我不能在长颈鹿和猴子的关系中指定它的逆是“动物园”,因为这将是无效的(在核心数据编辑器中)。

我通常使用子类,但我需要始终能够询问它们属于哪个 Zoo,因此需要一个通用接口。

非常感谢您的帮助,如果有什么我可以澄清的,请告诉我。

【问题讨论】:

  • 您想对giraffes / monkeys 关系做什么?您认为他们会为您提供便利吗?
  • 好吧,出于保密原因,我可以告诉你,它们不是长颈鹿或猴子,而是其他东西。尽管它们是“哺乳动物”,但它们基本上完全不同,我很少将它们视为动物,而是将它们视为独特的阶级类型。也应该说我不完全明白你在问我什么。
  • 您实际上有多个Zoo 实例吗?如当前所述,您将需要添加许多关系。但是,使用获取请求通常比使用关系更好......
  • 所以有一个动物/动物园关系,然后有一个名为giraffesmonkeys 的获取请求,对吗?我将如何在 CoreData 编辑器中编写该获取请求?我不是什么专家,但对于我来说,缓存结果对我来说很重要,因为我调用.giraffes.monkeys 的次数比.animals 更频繁@ 987654330@ 怎么样(我使用和爱发电机)
  • addGiraffesObject: 是一种编辑关系的方法。使用 fetch 请求不会缓存结果,但是您真的需要多久迭代一次 giraffes 的完整列表而不进行任何过滤/考虑批处理故障?

标签: ios macos inheritance core-data entity-relationship


【解决方案1】:

我认为你选择了一种艰难的方式来获得你想要的东西。创建如下图,您可以获取所需的一切。当您获取特定动物(比如说猴子)时,您始终可以获取它们与其他实体的关系。

zoo -->>(对许多)动物 -->(对一个)animalType

【讨论】:

  • 我明白了,然后当我使用动物类型进行提取时,它将返回一个具体子类的集合。好主意。这只是意味着我该怎么做以下? addGiraffesObject: ??然后我会在只调用addAnimalsObject: 的子类中实现这个方法吗??
  • 实际上我可能会将 animalType 设为抽象基类上的枚举。
  • 是的,我认为你说得对。定义animalType并将其添加到动物对象中,然后您可以将一组动物对象或单个对象添加到动物园。
【解决方案2】:

根据您的描述,我会考虑删除动物园 动物关系,因为您不经常使用它,而且维护起来会很麻烦。该关系还可能包含大量项目,因此您需要比关系单独允许的更细粒度的控制。而且,对于其他关系,您可以指定删除语义。

您喜欢使用特定方法,因此请在 Zoo 和您的每个动物子实体之间添加明确的关系。如果需要,请在每一个上指定删除规则(因此销毁 Zoo 会杀死所有动物)。每只动物都有一个指向zoo 的链接,并且会被恰当地命名。

对于知道所有animalsZoo,使用获取请求。你不经常使用它,当你这样做时,你真的应该指定批处理故障方法。

旁白:

通常您应该将关系简单地用作获取请求的数据源,特别是这样您就可以指定批量故障处理方法。即使您有 50 只长颈鹿,这也可能超过您在任何时候用于在 UI 上显示的数量。如果您正在执行数据操作,那么直接使用关系可能会很好。但是,如果您在 UI 上列出项目,则应该使用 fetch 请求,其中谓词使用关系来过滤适当的对象。

【讨论】:

  • 我会提供一点提示。动物园是硬件,动物是设备。设备在功能上可能有很大差异,但它们都有共同的属性,例如 hardwareAddress 等。因此,能够将动物添加到我的动物园,并且能够看到我的整个动物集合是很有趣的,尽管通常我'我有兴趣直接访问设备类型,因为它们基本上彼此几乎没有关系......也许这更好地描述了我的要求。
  • 当然,但它不会改变任何东西,因为您对动物园/动物的解释很好。我的回答是基于您描述的要求/交互频率/数据大小/代码简单性。
  • 是的,我会看看获取请求。如果他们的结果被缓存,那么它应该被证明是相当快的。在我看来,任何动物都应该知道它属于哪个动物园,我可以把动物放在动物园里。我对 Core Data 的这些方面还很陌生。
  • 结果不会被缓存(除非你明确地缓存它们),如果你做了缓存,那么你应该把每个对象都变成一个错误,这样当你不使用它时它就不会占用内存(当然如果在 iOS 上运行)。每只动物都与动物园有关系,只是在子实体上,而不是父实体。
【解决方案3】:

感谢所有建议。最后,我有了动物园-动物的关系,在 Zoo 对象上我写了几个助手:

@property (nonatomic, readonly) NSArray *giraffes;  // or monkeys

- (NSArray*)giraffes
{
      NSArray *giraffes = [Giraffe MR_findByAttribute:@"zoo"
                                      withValue:self
                                     andOrderBy:@"name"
                                      ascending:YES
                                      inContext:self.managedObjectContext];

      return giraffes; 
}

基类比你想象的更重要,知道核心数据会缓存很多,如果我经常调用它,性能不会有问题。

(如果 API 调用看起来有点奇怪,我会使用 MagicalRecord。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 2011-11-14
    相关资源
    最近更新 更多