如何让两个 NSManagedObject 类具有相同的超类

Posted

技术标签:

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

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

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

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

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

【问题讨论】:

【参考方案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 的子类。

【讨论】:

以上是关于如何让两个 NSManagedObject 类具有相同的超类的主要内容,如果未能解决你的问题,请参考以下文章

使用框架中的CoreData时如何解决“类'ClassName'的NSManagedObject必须具有有效的NSEntityDescription”

如何在类之间传输 NSManagedObject 子类?

具有两个不同核心数据 NSManagedObject 实体的 NSTreeController

具有强制关系的 NSManagedObject

具有相似属性的 NSManagedObject

NSManagedObject 类关系中的 NSPredicate 键