合奏和核心数据光迁移

时间:2016-03-02 11:32:50

标签: ios objective-c iphone core-data 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上传对象,而iCloud已经基于数据模型2)

提前致谢!

更新1:

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

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

如果没有,请考虑以下方案作为示例:

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

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

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

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

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

你不能阻止它,不。 Ensembles是一个分散的点对点系统。一台设备实际上无法知道另一台设备的当前状态,因此您无法阻止上传。

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

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