我有一个 Core Data 托管对象模型,所有这些模型都在 iOS 应用程序中设置和工作,我正在使用 NSManagedObject 子类,这些子类是使用 [[MyEntityClass alloc] initWithEntity:description insertIntoManagedObjectContext:context];
我一直在阅读一些关于 Core Data 迁移的教程,为应用程序将来可能的更新做准备。对于我目前为这个特定案例设想的变化,我相信轻量级迁移就足够了。我了解轻量级迁移将数据从旧数据模型映射到新版本。但是有一件事我不清楚。如果持久存储包含在迁移之前创建的 NSManagedObject 子类实例,这些对象是否会随模型一起修改以允许它们使用迁移中添加的属性?
我将举一个例子来确保我清楚我在问什么。假设我有一个名为 Person
的实体,使用经典示例。 Person 具有以下属性:
firstname
lastname
我创建了一个名为 aPerson
的 Person
实例,并将其插入到持久存储中。我可以使用 aPerson.firstname
和 aPerson.lastname
访问 aPerson
的属性。
现在我将 dateofbirth
属性添加到托管对象模型,因此 Person
实体包含以下属性:
firstname
lastname
dateofbirth
现在,如果我从持久存储中检索 aPerson
并尝试访问 aPerson.dateofbirth
会发生什么?我是否会收到无法识别的选择器错误,因为 aPerson
不包含 dateofbirth
属性,因为它是在添加该属性之前创建的?或者轻量级迁移是否会将 dateofbirth
属性和访问器方法添加到持久存储中已有的所有 Person
实例?
最佳答案
如果您向新模型版本添加属性,则该属性必须是可选的或者您必须指定默认值。否则,使用旧模型保存的持久存储将无法使用新模型进行验证。
在您的示例中,指定默认的 dateofbirth
没有任何意义,因此您可以将该属性设置为可选属性,并应对它有时不存在的情况。
我找不到关于此的明确文档。您应该非常彻底地测试迁移。
关于ios - 核心数据轻量级迁移 - 现有实体是否添加了新属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36494188/