【问题标题】:How to have two NSManagedObject classes with the same superclass如何让两个 NSManagedObject 类具有相同的超类
【发布时间】:2015-04-29 16:29:22
【问题描述】:

我有两个类MammalsFish,它们都继承自一个通用超类Animals。我想使用Core Data 存储我所有的MammalsFish,所以我将它们都设为NSManagedObject 的子类。所以,当我想获取我所有的MammalsFish 时,我只需执行几个获取请求。

我的问题是如何处理 Animals 超类。

  • 它的属性和方法显然是被两个子类使用的,那么它应该也是一个NSManagedObject吗?
  • 如果是这样,MammalsFish 是否甚至需要一个显式的 NSManagedObject 子类,因为它们已经是 Animals 的子类?
  • 这种方法有缺陷吗?

很抱歉,如果这是一个超级基本的问题,尤其是当答案只是“是;否”时。答案之一here 警告不要在数据模型中使用继承,因此我很担心。

【问题讨论】:

    标签: ios objective-c core-data


    【解决方案1】:

    您自己决定您的继承模型是否会在未来让您陷入困境。但是直接回答你的问题,你的继承树看起来像......

     NSManagedObject -> Animal -> Mammals 
                               -> Fish
    

    所以

    @interface Animal : NSManagedObject

    @interface Fish : Animal

    如果您将来需要升级模型并仍保留现有数据,请注意Core-Data 不适合复杂的重新排列。并非不可能,只是并不总是那么容易。

    【讨论】:

    • 感谢您的回复!因此,除了对模型进行未来更改之外,@shosti 在链接问题中的警告在这里不必担心吗? (它是:“如果您使用 SQL 后端,请不要在数据模型中使用继承。由于 SQL 后端的实现,它具有可怕的性能和空间特性”)
    • 这可能取决于您模型的最终尺寸。我以前从未见过这样的建议。我可能需要观看视频 :-) 但是我确实有几个基于 CD 的项目,它们使用对三层的继承,并且性能对我来说不是问题,超过 1000 个对象。当您使用超类目的地描述 to-relationship 根类时,它可能很有用,例如,您可能有一个名为 animalsThatIEat 的一对多关系,其目的地是动物,即 Bear -> Trout,Bunny,Squirrel,Crayfish
    • 好的,很高兴知道。谢谢!
    • 如果性能确实成为问题,请注意,您不需要让实体相互继承(这是为所有实体创建一个巨大表的原因)以拥有一个共同的基础为他们上课。
    【解决方案2】:

    使Animals 成为NSManagedObject 的子类。 使MammalsFish 成为Animals 的子类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-14
      • 1970-01-01
      • 2014-01-13
      相关资源
      最近更新 更多