【问题标题】:Customize core data model at runtime?在运行时自定义核心数据模型?
【发布时间】:2011-09-16 18:23:55
【问题描述】:

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

谢谢火柴

Ps:是mac os的应用程序!

【问题讨论】:

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


    【解决方案1】:

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

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

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

    Core Data 需要能够找到 源和目标管理对象 在运行时对自身进行建模。 (核心数据 搜索由返回的包 NSBundleallBundlesallFrameworks 方法。)那么它必须 分析架构更改为 持久的实体和属性和 生成推断的映射模型。 为了让 Core Data 能够做到这一点, 更改必须符合明显的 迁移模式,例如:

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

    这是否适合您的用例,或者您是否希望允许您的用户更改托管对象模型以使轻量级迁移成为不可能?

    无论如何,我强烈建议您在尝试允许您的用户修改 Core Data 模型之前通读以下文档。

    【讨论】:

    • 对于模型的简单突变,Core Data 会自动推断迁移映射,您甚至可以将用户修改后的模型存储在磁盘上,因为 NSManagedObjectModel 实现了 NSCoding。
    • @matchi 这回答了你的问题吗?
    【解决方案2】:

    查看NSManagedObjectModel reference page...

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

    我会说这绝对是一个高级 Core Data 主题(而且 Core Data 本身已经是一个相当高级的主题),不能掉以轻心。如果您让用户修改模型,我不确定已经存储在数据存储中的任何数据是否有用(甚至可用)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-30
      • 1970-01-01
      • 1970-01-01
      • 2013-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-12
      相关资源
      最近更新 更多