2013-03-18 112 views
0

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

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

工作流程应该是:

  1. 开始应用
  2. 如果检查数据库是最新的
  3. 如果模式的新版本可从Web服务做DDL命令
  4. 继续与应用程序的工作流程

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

+0

是否要修改Core Data使用的数据模型或其他内容?你说“数据库”这听起来像你的意思是核心数据以外的东西,但目前尚不清楚。 – 2013-03-18 16:21:36

+0

对不起,是的,我想修改核心数据模型 – user2181824 2013-03-26 15:49:39

回答

1

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

核心数据的API可以在运行时构建或修改数据模型的每个细节。 Xcode的模型编辑器很方便,但是如果你愿意,你可以跳过它并用代码完成所有的事情。例如,NSEntityDescriptionproperties属性(它涵盖了属性和关系)是可写的。您可以创建一个新的NSAttributeDescription并更新实体的属性以包含它。 Bang,你刚刚给实体添加了一个新的属性。同样,NSManagedObjectModelentities属性是可写的,因此您可以创建一个新的NSEntityDescription并将其添加到模型中。这给你一个新的实体,在运行时创建。

,这是一个很大的一个:您可以在加载数据存储这个之前只能做。一旦你加载你的持久化存储,改变模型会抛出一个异常。当Core Data加载持久性存储时,它将模型文件与存储文件中使用的模型进行比较。他们必须匹配,并且您无法在加载商店后做任何事情来改变这一事实。一旦你加载商店,模型是固定的。更重要的是,即使您在加载持久性存储之前修改模型,您也只能加载与当前版本的模型相匹配的持久性存储 - 除非您也编写代码将持久存储迁移到新模式。这很难取决于变化的性质。至少在加载先前保存的数据之前,您需要进行任何更改,然后安排进行模型迁移以更新持久性存储以使用新模型。

使用核心数据时,模型(模式)和数据分开存储并在商店加载时进行匹配。这不是SQLite如何在内部工作,而是核心数据强制执行的方式。