防止将实体组合到一个表中的核心数据

jjx*_*tra 9 xcode core-data ios

有没有办法告诉Core Data在所有实体都从基础实体继承时不将所有实体放入一个表中?这是一个例子:我们有一个"实体"对象,我们有一个继承自"实体"的"人物"和"产品".核心数据创建一个ZENTITY表,其中包含"Entity","Person"和"Product"的组合字段.我们想要的是核心数据创建两个单独的表,一个用于"Person",一个用于"Product".

这甚至可能吗?网上没有任何关于此的内容......

Ter*_*nus 13

我做了测量,当使用真实的继承(~50000个对象,20多个类,每个有~5个关系,大多数对多数)数据时,CoreData的性能完全降低.我没有将CD用于具有1000个对象的玩具应用程序 - 这是一个真正庞大的应用程序,性能压力是不合理的.更糟糕的是,由于这种愚蠢的实现,创建小对象需要大量的ssd和内存空间.

唯一真正的解决方案(我需要继承)是使用iOS 5及更高版本的NSIncrementalStore手动实现替换默认的sqlite持久存储.但是,对SQL转换和模型更新的获取请求实际上很难实现.

是的,我知道核心数据不是SQL.但我希望它在处理大量数据时能够以相对较快的速度运行 - 否则在现实世界的应用程序中使用它会很愚蠢.


Chr*_*ver 10

根据Florian Kugler详细文章,解决方案是在模型代码中使用继承,但不在模式中使用:

实体层次结构与类层次结构

托管对象模型提供了创建实体层次结构的可能性,即我们可以将实体指定为另一个实体的父级.这可能听起来不错,例如,如果我们的实体共享一些共同的属性.然而,在实践中,它很少是你想要做的.

幕后发生的事情是Core Data将所有具有相同父实体的实体存储在同一个表中.这会快速创建具有大量属性的表,从而降低性能.通常,创建实体层次结构的目的仅仅是创建类层次结构,以便我们可以将多个实体之间共享的代码放入基类中.有一个更好的方法来实现这一点.

实体层次结构独立于NSManagedObject子类层次结构.或者换句话说,我们不需要在实体中具有层次结构来创建类层次结构.

https://www.objc.io/issues/4-core-data/core-data-models-and-model-objects/