在运行时自定义核心数据模型?

4
我希望有一个可以由用户自定义的模型。使用核心数据是否可行,还是有更好的解决方案?
谢谢matchi。
附注:这是一个Mac OS应用程序!
2个回答

8

这在苹果的Core Data Utility Tutorial"Creating the Managed Object Model"下有解释。通常来说,一旦你获得了对托管对象模型的引用,你可以使用NSEntityDescriptionNSAttributeDescription类来自定义托管对象模型中的实体及其属性。

但需要注意,大多数情况下,一旦修改了托管对象模型,则它将不再与现有的持久化数据存储兼容,这意味着你必须将数据从旧的持久化存储迁移到新的存储,这绝对不是一个轻松的任务。

当然,如评论中所述,Core Data也可以自动迁移数据,这个过程称为轻量级迁移。一般来说,要实现这一点,Core Data需要在运行时自己找到源和目标托管对象模型。(Core Data搜索NSBundle的allBundles和allFrameworks方法返回的捆绑包。) 然后,它必须分析持久化实体和属性的模式变化,并生成一个推断的映射模型。为了使Core Data能够做到这一点,这些更改必须符合明显的迁移模式,例如:
- 新属性的简单添加 - 非可选属性变为可选属性 - 可选属性变为非可选属性,并定义默认值
这是否符合您的用例,或者您想允许用户以使轻量级迁移不可能的方式更改托管对象模型?
无论如何,在您尝试允许用户修改Core Data模型之前,我强烈建议您阅读以下文档。

对于模型的简单变异,Core Data会自动推断迁移映射,你甚至可以将用户修改后的模型存储在磁盘上,因为NSManagedObjectModel实现了NSCoding。 - ImHuntingWabbits

1
请参阅NSManagedObjectModel参考页面...
引用: 管理对象模型可编辑,直到被对象图管理器使用为止。然而,一旦模型正在使用中,就不能进行更改。
我认为这绝对是一个高级的Core Data话题(而Core Data本身已经是一个相当高级的话题),不容忽视。如果您让用户修改模型,我不确定任何已存储在数据存储中的数据是否有用(甚至可用)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接