核心数据继承:这样做可以吗?
Posted
技术标签:
【中文标题】核心数据继承:这样做可以吗?【英文标题】:Core Data inheritance: Is it OK to do this? 【发布时间】:2010-12-22 10:56:18 【问题描述】:示例:我有一个名为Car
的实体,它是抽象。然后有两个子实体Cabriolet
和Pickup
。
现在我有一个名为Driver
的实体,它与实体Car
有一个名为currentCar
1..1 的关系。因此,我可以将 Cabriolet 或 Pickup 分配给任何驾驶员的 currentCar 属性。然后,当我从驾驶员那里获得 currentCar 时,我需要自省对象以在运行时找出我是否有 Cabriolet 或 Pickup。这是 Core Data 中的有效设计吗?
【问题讨论】:
【参考方案1】:我不明白为什么这在技术层面上不起作用,但它确实违反了 OOP 多态性。
为什么你需要知道汽车的类型?您能否在抽象超类(Car
)上定义方法并在子类(Cabriolet
和Pickup
)中适当地覆盖它们?您能否重构汽车层次结构,使子类的属性变得更通用,并将它们移动到Car
的属性中,从而消除对子类的需求?
在获取从公共超类派生的对象时,我遇到了NSFetchResultsController
的问题。 (返回的对象只能按实体的属性进行排序/分组。类类型不是属性,因此不能用于对实体进行排序/分组。我的解决方案/hack 是超类的type
属性-丑陋,但它有效。)
【讨论】:
敞篷车添加了一个 BOOL hasElectricRoof。基本上问题是如果我获取 currentCar,并且我之前分配了一辆 Cabriolet(这也是一辆汽车),那么我可以将它转换成 Cabriolet 吗?还是 Core Data 不会只获取 Cabriolet 中定义的属性? @BugAlert:是的。您始终可以使用valueForKey:
方法获取数据,前提是该类是NSManagedObject
的子类。
这不是重点,本尼迪克特。我知道我可以获取对象。关键是:当故障被触发时,特殊属性是否可用和获取,还是不会?!
专家选择器是调用valueForKey:
的简单方法。一个NSManagedObject
子类完全有可能代表许多不同的实体;没有检查子类中声明的访问器是否会匹配它所代表的实体的机制。以上是关于核心数据继承:这样做可以吗?的主要内容,如果未能解决你的问题,请参考以下文章