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

时间:2011-06-16 21:44:55

标签: objective-c database cocoa macos core-data

我想要一个可以由用户定制的模型。  是否可以使用核心数据或是否有更好的解决方案?

感谢matchi

Ps:它是mac os的应用程序!

2 个答案:

答案 0 :(得分:8)

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

但是,请注意,在大多数情况下,一旦修改了托管对象模型,它将不再与现有的持久性数据存储兼容,这意味着您必须将数据从旧的持久性存储迁移到新的持久性存储。这绝对不是一个可以掉以轻心的努力。

当然,正如评论中所提到的,Core Data也可以自动迁移数据,这个过程称为轻量级迁移。但总的来说,这样做

  

核心数据需要能够找到   源和目标托管对象   在运行时模拟自己。 (核心数据   搜索返回的包   NSBundle allBundlesallFrameworks   {{1}}方法。)然后必须   分析架构更改   持久性实体和属性   生成推断的映射模型。   为了使核心数据能够做到这一点,   变化必须明显   迁移模式,例如:

     
      
  • 简单添加新属性
  •   
  • 非可选属性变为可选
  •   
  • 可选属性变为非可选属性,并定义默认值
  •   

这是否适合您的使用案例,或者您是否希望允许您的用户更改托管对象模型,从而无法实现轻量级迁移?

在任何情况下,我强烈建议您在尝试允许用户修改Core Data模型之前先阅读以下文档。

答案 1 :(得分:1)

请参阅NSManagedObjectModel reference page ...

  

托管对象模型是可编辑的   直到它们被对象图使用   经理...然而,一旦模型是   使用时,不得更改......

我认为这绝对是一个高级的核心数据主题(核心数据本身已经是一个非常先进的主题),不能轻易进行。如果让用户修改模型,我不确定已存储在数据存储中的任何数据是否有用(甚至可用)。