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

标签 ios core-data migration

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

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

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

firstname
lastname

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

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

firstname
lastname
dateofbirth

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

最佳答案

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

在您的示例中,指定默认的 dateofbirth 没有任何意义,因此您可以将该属性设置为可选属性,并应对它有时不存在的情况。

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

关于ios - 核心数据轻量级迁移 - 现有实体是否添加了新属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36494188/

相关文章:

ios - 为 lldb 中的 segue 错误做准备

asp.net - 在 asp.net mvc 中读取 html 页面

swift 2.3 NSFetchRequest

ios - iOS-如何检测iDevice广告是否已接通电源

ios - 无法使用对象映射器解析双字符串下方

ios - event.touchesForView().AnyObject() 在 Xcode 6.3 中不起作用

iphone - NSPredicate 比较可能为 nil 的键

iphone - 在 iPhone 上实现全文搜索?

ios - 如何在后台使用核心数据?

ruby-on-rails - 我可以在多对多关系中添加到现有的连接表模型吗?