0

我目前正在使用 Ensembles 进行一些测试,特别是测试 Core Data 轻迁移。

我目前的配置如下:

  • 使用数据模型 1 运行我的应用程序的设备 A
  • 使用数据模型 2 运行我的应用程序的设备 B
  • 数据模型 2 基于数据模型 1,具有一个附加的字符串属性,该属性是可选的

我的情况如下:

  • 一开始,在 Device-A 和 Device-B 上使用数据模型 1 运行我的应用程序,使用 Ensembles(iCloud 配置)同步一切正常
  • 在 Device-B 上,使用数据模型 2 安装并运行我更新的应用程序
  • 在 Device-A 上,继续使用数据模型 1 运行我的旧应用程序,并添加一条新记录
  • 结果:在Device-A上添加的新记录上传到iCloud,然后同步到Device-B

我的问题:如果相关数据模型不是最新的,我可以配置 Ensembles 以防止其将更改上传到 iCloud?(即在我的情况下,设备 A 上传基于数据模型 1 的对象,而 iCloud 已经基于数据模型 2)

提前致谢!

更新 1:

德鲁,非常感谢你的回答。我绝对同意不能(也可能不应该)阻止上传,因为 Ensembles 是一个去中心化的点对点系统。

在理想情况下,我希望具有新数据模型的设备将忽略基于旧数据模型的数据。(以类似于现有行为的方式,具有旧数据模型的设备将忽略基于新数据模型的任何数据)。支持吗?

如果不是,请以以下场景为例:

  • 旧数据模型有一个名为“Book”的实体,它有两个属性:标题和作者(这两个字段都是非可选的)
  • 新数据模型有一个名为 titleFirstLetter 的新可选属性,它应该包含标题字段的第一个字母。

目前,当不涉及 Ensembles 时,我可以完全控制将新的 NSManagedObject 保存到持久存储。因此,我负责添加新书的应用程序的更新代码将确保从标题字段中提取第一个字母并将其保存到新的 titleFirstLetter 属性中。(即保存书时,标题为 Catch-22 的书的 titleFirstLetter 属性中将包含 C)。

另外,当核心数据栈发生轻迁移时,我检测到这一点,并执行一次性程序,迭代数据库中所有现有书籍,并根据标题值设置titleFirstLetter。从现在开始,数据库是一致且有效的,而新代码将确保将来添加到数据库中的书籍将保持数据库有效。

关于 Ensembles,如果我对来自具有旧数据模型的设备的旧数据没有任何控制权,如果我的代码从未被调用,我该如何填充 titleFirstLetter 的新属性?

感谢您的热心帮助!

4

1 回答 1

1

你无法阻止它,不。Ensembles 是一个去中心化的点对点系统。一台设备确实无法知道另一台设备的当前状态,因此您无法阻止上传。

更新的设备应该能够处理来自其他设备的旧数据。具有旧型号的设备将忽略基于新型号的任何数据,直到它也被更新。然后它将合并所有被忽略的数据。

最好尽可能避免迁移,并坚持使用简单的东西,例如添加属性或实体,而不是棘手的重构。如果您需要进行大量更改,请考虑从一个新的集成开始(例如更改集成标识符)。

于 2016-03-02T14:38:02.690 回答