0

我想在运行时将表/列添加到数据库中。目前我正在使用核心数据。我知道在 XCode 中可以这样做(添加新的数据模型版本),但我绝对不能使用这种方式,因为我从 Web 服务接收数据库模式。

使用 Core Data 时是否有可能在运行时运行 ddl 命令,或者是否可以直接使用 sqlite(或包装器/或映射器)?如果最好使用包装器/映射器,请给我一些关于在这种情况下应该使用哪个的建议。

工作流程应该是:

  1. 启动应用
  2. 检查数据库是否是最新的
  3. 如果 Web 服务提供了新版本的架构,则执行 DDL 命令
  4. 继续应用工作流程

PS:请不要提供描述使用 XCode 修改架构的替代方案的答案!

4

1 回答 1

1

您可以在运行时修改 Core Data 模型吗?是的...但是,它可能无法按照您希望的方式工作。

Core Data 的 API 使得在运行时构建或修改数据模型的每个细节成为可能。Xcode 的模型编辑器很方便,但如果您愿意,您可以跳过它并在代码中执行所有操作。例如,NSEntityDescriptionproperties属性(包括属性和关系)是可写的。您可以创建一个新NSAttributeDescription实体并更新实体的属性以包含它。Bang,您刚刚为实体添加了一个新属性。同样,NSManagedObjectModelentities属性是可写的,因此您可以创建一个新属性NSEntityDescription并将其添加到模型中。这为您提供了一个在运行时创建的新实体。

但是,这是一个大问题:您只能在加载数据存储之前执行此操作。加载持久存储后,更改模型将引发异常。当 Core Data 加载持久存储时,它会将模型文件与存储文件中使用的模型进行比较。它们必须匹配,加载商店后您无法更改此事实。加载商店后,模型就固定了。

更重要的是,即使您在加载持久存储之前修改了模型,也只能加载与模型当前版本匹配的持久存储——除非您还编写代码将持久存储迁移到新模型。这有多难取决于变化的性质。至少,您需要在加载之前保存的数据之前进行任何更改,然后还安排进行模型迁移以更新持久存储以使用新模型。

使用 Core Data,模型(模式)和数据是分开存储的,并在加载存储时匹配。这不是 SQLite 在内部工作的方式,而是 Core Data 强制执行的方法。

于 2013-03-26T16:08:20.910 回答