有人想要合并多个NSManagedObjectModel有几个原因。如果您搜索Web,所有的回答都是不可能,或者只有共享一个或多个关系的两个不相关的实体才可能。例如,请参阅this和this链接。
然而,通过一点或更多的工作,(我认为)合并NSManagedObjectModels是可能的,即使实体是相关的(如在父子关系中)或者属性分布在多个模型中。
虽然它不会在Xcode模型编辑器中显示,并且开箱即用的过渡(可能)不起作用。
下面是我对核心数据的观察和我对合并几个模型的代码。如果你发现任何错误或有改进的建议,请在这里回复。
2条答案
按热度按时间o2g1uqev1#
NSManagedObjectModel
类具有以下工厂方法/构造函数可选的
forStoreMetadata
属性允许指定模型的版本。请参阅https://developer.apple.com/documentation/coredata/nsmanagedobjectmodel
(* 我怀疑这些方法在操作员询问和回答问题时不可用。)*
snvhrwxg2#
我注意到了一些事情:
1.复制NSPropertyDescription(属性,关系)会复制其所有值,但不会复制其所属的实体。对于destinationEntity与inverseRelationship也是如此。
1.因此,复制的NSPropertyDescription应该被添加到实体中。因此,该实体的所有子实体也会自动获得该属性。
1.复制的NSEntityDescription不包含父实体。因此必须手动重新生成(NSManagedObjectEntity的)树。
1.如果设置了某个实体的父代,则该(子)实体将立即自动继承其所有父代属性。* 换句话说,当您向某个实体询问其属性时,此实体已经知道其所有属性。它不会首先查询其父代。(合理假设)*
1.将实体添加到模型中会填充目标实体以及所添加实体的relationsDescriptions的反向关系描述。
1.如果您在使用任何实体或属性之前没有设置它的名称,那么核心数据就会抱怨。* 这是copy by name方面,而不是值方面。*
1.如果一个实体已经有一个同名的属性(无论是从自身还是从其祖先继承而来),则向该实体添加一个属性会使核心数据产生问题。
这将转换为以下代码:
在managedObjectModel(xcode编辑器)中,在实体和/或属性的用户信息字典中设置“placeholder”标志。
通过在用户信息字典中设置附加键来指定哪个模型具有主要实体/属性/关系(设置),并适当地调整该代码片段,可以细化模型生成。
然而,如果你可以避免使用多个模型,那就避免使用它。坚持标准的单一模型方法,你的生活会简单得多。
[免责声明:据我所知,这段代码应该可以工作。虽然没有保证。]