核心数据轻量级迁移 - 现有实体是否添加了新属性?

时间:2016-04-08 07:42:28

标签: ios core-data migration

我有一个Core Data托管对象模型都在iOS应用程序中设置和工作,我使用NSManagedObject子类,使用[[MyEntityClass alloc] initWithEntity:description insertIntoManagedObjectContext:context];实例化

我一直在阅读有关Core Data迁移的一些教程,以准备将来可能对应用程序进行更新。对于我目前为这种特殊情况设想的变化,我相信轻量级迁移就足够了。我知道轻量级迁移将数据从旧数据模型映射到新版本。但有一点我不清楚。如果持久存储包含从迁移之前创建的NSManagedObject子类实例,那么这些对象是否会随模型一起修改,以允许它们使用迁移中添加的属性?

我举一个例子来确保我清楚我要问的是什么。假设我有一个名为的实体,使用经典示例Person。 Person具有以下属性:

firstname
lastname

我创建了一个名为Person的{​​{1}}实例,并将其插入到持久性存储中。我可以使用aPersonaPerson访问aPerson.firstname个属性。

现在我向托管对象模型添加aPerson.lastname属性,因此dateofbirth实体包含以下属性:

Person

现在,如果我从持久性商店中检索firstname lastname dateofbirth 并尝试访问aPerson会发生什么?我是否会收到无法识别的选择器错误,因为aPerson.dateofbirth由于在添加该属性之前创建了aPerson属性而不包含dateofbirth属性?或者轻量级迁移会将dateofbirth属性和访问器方法添加到持久存储中已存在的Person的所有实例中吗?

1 个答案:

答案 0 :(得分:1)

如果将属性添加到新模型版本,则该属性必须是可选的,或者必须指定默认值。否则,使用旧模型保存的持久性存储将无法使用新模型进行验证。

在您的示例中,指定默认dateofbirth是没有意义的,因此您可以将该属性设置为可选,并且有时候不存在该属性。

我找不到关于此的明确文档。您应该非常彻底地测试迁移。