在映射出数据模型中的所有实体/属性/关系后,我创建了所有的托管对象。现在我有一个问题,当我第一次设计我的一个实体/类时,需要添加我没有想过的其他属性/关系。有没有办法用Core Data修改我现有的NSManagedObject类,而不是擦除我的所有模型并根据新的xcdatamodel重新创建它们?
在xcdatamodel中添加属性是否也会更新底层存储机制?假设我使用SQLite3作为我的持久存储,它会相应地添加列吗?
答案 0 :(得分:10)
正如groundhog指出的那样,对于数据模型的复杂更改,您需要创建模型的版本并将旧模型下的数据迁移到新模型中,遵循Apple关于此事项的指南(他链接到此)。不要担心任何幕后的SQL,核心数据会为您处理。
然而,对于简单的数据模型更改,Apple在Core OS的iPhone OS 3.0实现中引入了一项名为lightweight migration的新功能。对于轻量级迁移,Core Data将自动迁移到数据模型中的简单更改,例如更改属性或实体的名称,删除属性,添加具有默认值的属性或更改实体的继承。您只需要在新版本中输入重命名标识符以指向旧版本的名称等等。只要您设置NSMigratePersistentStoresAutomaticallyOption和NSInferMappingModelAutomaticallyOption选项,Core Data将以有效的方式处理您的数据更新。你的持久商店。
答案 1 :(得分:9)
如果你的意思是“我可以改变我的xcdatamodel,只是将生成的代码中的更改合并到NSManagedObject派生类的现有代码中”,是的,这很简单。您只需为已更改的模型生成代码,然后手动将更改合并到这些特定的派生类中。由于这些变化听起来只是额外的属性和关系,所以这应该是微不足道的 - 实际上,如果您的更改本质上是加性的,您可以使用diff和patch半自动执行此操作。
但是,如果您需要将现有商店迁移到新架构,那么您需要先做一些工作。某些条件(添加正交实体,获取的属性等)不会强制您执行此操作。当您尝试将现有持久性存储添加到托管对象上下文的持久性存储协调器时,您将意识到是否需要。
在您决定开始进行架构更改之前,您应该始终了解如何在Core Data中执行migrations and versioning - 如果您有现有的商店需要保留。在具有存储在Core Data存储中的用户数据的应用程序中几乎可以肯定。除非您拥有自动导入工具或数据存储生成实用程序,否则您现有的静态存储也可能需要迁移。
答案 2 :(得分:0)
您还应该查看Generation Gap设计模式。在这种情况下它会帮助你。 Here是一个关于使用核心数据代沟的问题。