核心数据实体继承 - >限制?

时间:2011-05-26 16:44:29

标签: iphone inheritance core-data entity class-design

我以为我会把这个发布到社区。我正在使用coredata,并且有两个实体。两个实体都具有层次关系。我现在注意到很多重复的功能,我想知道我是否应该重新构造一个基本实体,它是抽象的(HierarchicalObject),并让我的实体继承它们。

所以问题是我应该考虑这种继承的一些限制吗?阅读那里的一些帖子,我看到一些权衡,如果我的假设是正确的,请告诉我。

  1. (好)清理结构,将HierarchicalObject功能保留在一个位置。
  2. (确定)通过继承,两个对象现在最终都在同一个sqlite表中(我使用Sqlite作为后端)。那么如果对象数量增加,搜索/排序可能需要更长时间?不确定这是否是一个大问题,因为在我的情况下,对象的数量应保持相当静态。
  3. (不太好)继承,关系会变得更复杂吗? (http://www.cocoadev.com/index.pl?CoreDataInheritanceIssues
  4. 还有其他需要考虑的因素吗?

    感谢您的评论。

3 个答案:

答案 0 :(得分:12)

我认为绘制实体和类之间的并行是错误的。虽然非常相似但确实存在一些重要的差异。

最重要的区别是实体没有像类一样的代码,所以当你拥有具有重复属性的实体时,你不会添加大量的额外编码和引入错误的可能性。

很多人认为类继承必须并行实体继承。它不是。只要一个类从NSManagedObject继承并响应它所代表的实体的正确键值消息,该类就可以在其继承中进行许多不会在实体继承中反映出来的快乐冒险。例如。在NSManagedObject下面创建一个自定义基类是相当常见的,并且所有后续托管对象子类都继承自该基类,而不管它们的实体如何。

我认为绝对需要实体继承的唯一时间是您需要在同一关系中显示不同的实体。 E.g:

Owner{
  vehical<-->Vehical.owner
}

Vehical(abstract){
  owner<-->Owner.vehical
}

Motocycle:Vehical{ 

}

Car:Vehical{

}

现在,Owner.vehical可以包含Motocycle个对象或Car个对象。请注意,MotocycleCar的托管对象类继承不必相同。你可以拥有像Motocycle:TwoWheeled:NSManagedObjectCar:FourWheeled:NSManagedObject这样的东西,一切都会好起来的。

最后,实体只是上下文的指令,告诉它对象图如何组合在一起。只要您的实体安排能够实现这一点,您就可以在设计细节方面获得很大的灵活性,比在类似的类似情况下要多得多。

答案 1 :(得分:4)

我认为提及iOS 10上的Notes应用程序在其核心数据模型中使用继承是有用的。它们使用基本实体SyncingObject,它有7个子实体,包括Note和Folder。正如您所提到的,所有这些都存储在同一个SQLite表中,该表具有高达106列,并且由于在所有实体之间共享,因此大多数都是NULL。他们还实现了文件夹注释一对多关系作为多对多关系,它创建了一个数据透视表,这可能是继承问题的解决方法。

使用可能超过这些存储限制的实体继承有几个优点。例如,唯一约束在实体之间可以是唯一的。并且获取请求可以返回不同的实体,使得使用获取的结果控制器的UI更简单,例如,按侧栏中的帐户或文件夹分组。

答案 2 :(得分:0)

过去我曾经遇到过具有继承性的模型的数据迁移问题 - 您可能希望对其进行试验,看看是否可以让它发挥作用。

正如您所指出的,所有对象都放在一个表中。

然而,由于Core Data正在管理一个对象图,所以保持结构的方式非常好,你可以自然地只使用它来建模对象 - 包括继承。要保持模型的合理性,还有很多事要说,这样你就不必在维护代码方面做得更少。

我亲自在我自己的一个应用程序中使用了一个相当复杂的CD模型继承,并且它运行正常(除了我说有数据迁移的问题,但这对我来说一般来说都很好看我不再依赖于那种工作了。)

相关问题