如何让两个 NSManagedObject 类具有相同的超类
Posted
技术标签:
【中文标题】如何让两个 NSManagedObject 类具有相同的超类【英文标题】:How to have two NSManagedObject classes with the same superclass 【发布时间】:2015-04-29 16:29:22 【问题描述】:我有两个类Mammals
和Fish
,它们都继承自一个通用超类Animals
。我想使用Core Data 存储我所有的Mammals
和Fish
,所以我将它们都设为NSManagedObject 的子类。所以,当我想获取我所有的Mammals
和Fish
时,我只需执行几个获取请求。
我的问题是如何处理 Animals
超类。
Mammals
和 Fish
是否甚至需要一个显式的 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
的子类。
使Mammals
和Fish
成为Animals
的子类。
【讨论】:
以上是关于如何让两个 NSManagedObject 类具有相同的超类的主要内容,如果未能解决你的问题,请参考以下文章
使用框架中的CoreData时如何解决“类'ClassName'的NSManagedObject必须具有有效的NSEntityDescription”