集成和核心数据轻迁移
Ensembles and Core Data Light Migration
我目前正在使用 Ensembles 进行一些测试,特别是测试 Core Data 轻量级迁移。
我目前的配置如下:
- Device-A 运行使用数据模型 1 连接我的应用程序
- Device-B 运行使用数据模型 2 连接我的应用程序
- 数据模型 2 基于数据模型 1 并增加了一个字符串 属性,这是可选的
我的场景如下:
- 一开始,运行在 Device-A 和 Device-B 上使用数据模型 1 连接我的应用程序,使用 Ensembles(iCloud 配置)一切都很好同步
- 在 Device-B 上,使用数据模型 2
安装和 运行 我更新的应用程序
- 在 Device-A 上,运行使用数据模型 1 保留我的旧应用,并添加一条新记录
- 结果:在Device-A上添加的新记录上传到iCloud,然后同步到device-B
我的问题:如果相关数据模型不是最新的,我可以配置 Ensembles 以防止它上传更改到 iCloud 吗? (即在我的例子中,Device-A 基于数据模型 1 上传 object,而 iCloud 已经基于数据模型 2)
提前致谢!
更新 1:
德鲁,非常感谢你的回答。我绝对同意不能(而且可能不应该)阻止上传,因为 Ensembles 是一个去中心化的 peer-to-peer 系统。
在理想情况下,我希望具有新数据模型的设备会忽略基于旧数据模型的数据。 (以类似于现有行为的方式,其中具有旧数据模型的设备将忽略基于新数据模型的任何数据)。支持吗?
如果不是,请考虑以下场景为例:
- 旧数据模型有一个名为 'Book' 的实体,具有两个属性:标题和作者(这两个字段都不是可选的)
- 新数据模型有一个名为 titleFirstLetter 的新可选 属性,它应该包含标题字段的第一个字母。
目前,当不涉及 Ensembles 时,我可以完全控制将新的 NSManagedObject 保存到持久性存储。因此,负责添加新书的我的应用程序的更新代码将确保从标题字段中提取第一个字母并将其保存到新的 titleFirstLetter 属性。 (即,当书被保存时,名为 Catch-22 的书将在 titleFirstLetter 属性 中有 C)。
此外,当核心数据堆栈发生轻度迁移时,我检测到这一点,并执行 one-time 程序,我迭代数据库中所有现有的书籍,并根据标题值设置 titleFirstLetter .从现在开始,数据库是一致和有效的,而新代码将确保未来添加到数据库中的书籍将保持数据库有效。
关于 Ensembles,如果我无法控制来自具有旧数据模型的设备的旧数据,如果我的代码从未被调用,我该如何填充 titleFirstLetter 的新 属性?
感谢您的帮助!
你无法阻止它,不。 Ensembles 是一个去中心化的点对点系统。一台设备确实无法知道另一台设备的当前状态,因此您无法阻止上传。
更新后的设备应该能够处理来自其他设备的旧数据。具有旧型号的设备将忽略基于新型号的任何数据,直到它也被更新。然后它将合并所有被忽略的数据。
最好尽可能避免迁移,并坚持简单的事情,例如添加属性或实体,而不是棘手的重构。如果您需要进行大量更改,请考虑从一个新的整体开始(例如,更改整体标识符)。
我目前正在使用 Ensembles 进行一些测试,特别是测试 Core Data 轻量级迁移。
我目前的配置如下:
- Device-A 运行使用数据模型 1 连接我的应用程序
- Device-B 运行使用数据模型 2 连接我的应用程序
- 数据模型 2 基于数据模型 1 并增加了一个字符串 属性,这是可选的
我的场景如下:
- 一开始,运行在 Device-A 和 Device-B 上使用数据模型 1 连接我的应用程序,使用 Ensembles(iCloud 配置)一切都很好同步
- 在 Device-B 上,使用数据模型 2 安装和 运行 我更新的应用程序
- 在 Device-A 上,运行使用数据模型 1 保留我的旧应用,并添加一条新记录
- 结果:在Device-A上添加的新记录上传到iCloud,然后同步到device-B
我的问题:如果相关数据模型不是最新的,我可以配置 Ensembles 以防止它上传更改到 iCloud 吗? (即在我的例子中,Device-A 基于数据模型 1 上传 object,而 iCloud 已经基于数据模型 2)
提前致谢!
更新 1:
德鲁,非常感谢你的回答。我绝对同意不能(而且可能不应该)阻止上传,因为 Ensembles 是一个去中心化的 peer-to-peer 系统。
在理想情况下,我希望具有新数据模型的设备会忽略基于旧数据模型的数据。 (以类似于现有行为的方式,其中具有旧数据模型的设备将忽略基于新数据模型的任何数据)。支持吗?
如果不是,请考虑以下场景为例:
- 旧数据模型有一个名为 'Book' 的实体,具有两个属性:标题和作者(这两个字段都不是可选的)
- 新数据模型有一个名为 titleFirstLetter 的新可选 属性,它应该包含标题字段的第一个字母。
目前,当不涉及 Ensembles 时,我可以完全控制将新的 NSManagedObject 保存到持久性存储。因此,负责添加新书的我的应用程序的更新代码将确保从标题字段中提取第一个字母并将其保存到新的 titleFirstLetter 属性。 (即,当书被保存时,名为 Catch-22 的书将在 titleFirstLetter 属性 中有 C)。
此外,当核心数据堆栈发生轻度迁移时,我检测到这一点,并执行 one-time 程序,我迭代数据库中所有现有的书籍,并根据标题值设置 titleFirstLetter .从现在开始,数据库是一致和有效的,而新代码将确保未来添加到数据库中的书籍将保持数据库有效。
关于 Ensembles,如果我无法控制来自具有旧数据模型的设备的旧数据,如果我的代码从未被调用,我该如何填充 titleFirstLetter 的新 属性?
感谢您的帮助!
你无法阻止它,不。 Ensembles 是一个去中心化的点对点系统。一台设备确实无法知道另一台设备的当前状态,因此您无法阻止上传。
更新后的设备应该能够处理来自其他设备的旧数据。具有旧型号的设备将忽略基于新型号的任何数据,直到它也被更新。然后它将合并所有被忽略的数据。
最好尽可能避免迁移,并坚持简单的事情,例如添加属性或实体,而不是棘手的重构。如果您需要进行大量更改,请考虑从一个新的整体开始(例如,更改整体标识符)。