核心数据:重命名属性而不会对用户及其当前数据产生问题

Posted

技术标签:

【中文标题】核心数据:重命名属性而不会对用户及其当前数据产生问题【英文标题】:Core Data: Rename Attribute without having issues with users and their current data 【发布时间】:2016-09-08 13:02:58 【问题描述】:

我只想为我的应用程序的新版本重命名并在我的表上添加属性,如果应用程序已安装,我想保留数据。

首先我只是设置选项:

        let options = [NSMigratePersistentStoresAutomaticallyOption:true, NSInferMappingModelAutomaticallyOption:true]
        try coordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: options)

我创建了一个新版本的模型,所以如果我重命名属性并在新模型上的表中添加另一个属性,应用程序会保留数据吗?

【问题讨论】:

请使用新的详细信息更新您的原始问题,而不是创建副本。 Core Data: Add a column on a table的可能重复 【参考方案1】:

根据 Apple 的核心数据版本控制和迁移指南中关于轻量级迁移的部分:

如果重命名实体或属性,可以将目标模型中的重命名标识符设置为源模型中相应属性或实体的名称。您可以使用 Xcode 数据建模工具的属性检查器(对于实体或属性)在托管对象模型中设置重命名标识符。例如,您可以: ...将汽车的颜色属性重命名为paintColor

【讨论】:

【参考方案2】:

您的代码请求自动进行轻量级迁移。如果您想重命名一个属性,像这样迁移不会保留该属性的数据。所有其他数据将被保留。 Core Data 会将其视为删除旧属性并添加新的不相关属性。

如果要重命名属性并保留该属性的数据,则不能使用自动轻量级迁移。您需要创建一个映射模型来告诉 Core Data 如何迁移数据——具体来说,告诉它来自旧属性名称的数据应该移动到使用新属性名称。一旦你有多个版本的模式,你可以在 Xcode 中创建一个映射模型来设置它。整个过程在Apple's guide to model migration中描述。

【讨论】:

只要您不将 CoreData 与 CloudKit 同步,Apple 的轻量级迁移过程就完全支持重命名。有关更多详细信息,另请参阅developer.apple.com/documentation/coredata/… 了解更多详细信息。

以上是关于核心数据:重命名属性而不会对用户及其当前数据产生问题的主要内容,如果未能解决你的问题,请参考以下文章

核心数据:在获取时重命名属性

核心数据:仅添加或重命名一个属性时仍会发生迁移?

核心数据轻量级迁移属性重命名

如何使用 bash 脚本重命名当前目录及其子目录中的文件?

重命名由当前名称引用的多个数据框列

Laravel Eloquent 序列化:如何重命名属性?