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

Ios 核心数据轻量级迁移—现有实体是否添加了新属性?,ios,core-data,migration,Ios,Core Data,Migration,我有一个核心数据管理对象模型,所有这些模型都在iOS应用程序中设置和运行,我使用的是NSManagedObject子类,这些子类是使用[[MyEntityClass alloc]initWithEntity:description InsertingManagedObject:context]实例化的 我一直在阅读一些关于核心数据迁移的教程,为将来可能的应用程序更新做准备。对于我目前设想的针对这种特殊情况的更改,我相信轻量级迁移就足够了。我知道轻量级迁移将数据从旧数据模型映射到新版本。但有一件事

我有一个核心数据管理对象模型,所有这些模型都在iOS应用程序中设置和运行,我使用的是NSManagedObject子类,这些子类是使用
[[MyEntityClass alloc]initWithEntity:description InsertingManagedObject:context]实例化的

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

我将举一个例子,以确保我清楚地知道我在问什么。假设我有一个名为Person的实体,使用经典示例,
Person
。此人具有以下属性:

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

现在,我向托管对象模型添加了一个
dateofbirth
属性,因此
Person
实体包含以下属性:

firstname
lastname
firstname
lastname
dateofbirth

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

如果向新模型版本添加属性,则该属性必须是可选的,或者必须指定默认值。否则,与旧模型一起保存的持久存储将不会与新模型一起验证

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


我找不到这方面的明确文档。您应该非常彻底地测试迁移。

非常感谢,这非常有帮助!因此,当您说处理不存在的属性时,是否会涉及类似于
if([myEntity respondsToSelector:@selector(myMigratedAttributeName)){…}
否,方法在类上,而不是实例上。您阅读属性并查看它是否为
nil
方法在类上,而不是实例上
-是,但不会
响应选择器:
验证属性是否存在于NSManagedObject子类上?如果实体子类是在数据迁移之前创建的,则清空以访问添加的属性只会返回nil,还是会导致无法识别的选择器异常?它将返回
nil
。托管对象的属性来自其实体的属性,并且该实体是托管对象模型的一部分。啊,好的。我假设托管对象与任何属性一起整体存储es它已经设置好了,因此如果一个“旧”托管对象没有添加新版本实体的属性,应用程序将崩溃。如果它只返回nil,那么这很好。非常感谢您的帮助!