集成和核心数据轻迁移

Posted

技术标签:

【中文标题】集成和核心数据轻迁移【英文标题】:Ensembles and Core Data Light Migration 【发布时间】:2016-03-02 11:32:50 【问题描述】:

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

我目前的配置如下:

Device-A 使用数据模型 1 运行我的应用程序 Device-B 使用数据模型 2 运行我的应用程序 数据模型 2 基于数据模型 1,并带有一个额外的字符串属性,该属性是可选的

我的场景如下:

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

我的问题:我可以配置 Ensembles 以防止它上传更改到 iCloud,以防相关数据模型不是最新的? (即在我的例子中,Device-A 基于数据模型 1 上传对象,而 iCloud 已经基于数据模型 2)

提前致谢!

更新 1:

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

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

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

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

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

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

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

感谢您的热心帮助!

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

德鲁,非常感谢您的回答!请参阅关于我原来的问题的更新 1。 您的代码确实被调用了。为此有许多委托方法。您可以在合并后或合并完成块中查看委托方法中的更改,并应用您的特殊更改。 你是对的。我刚刚意识到 persistentStoreEnsemble:didSaveMergeChangesWithNotification: 将完全针对我所需要的。感谢您为我指明正确的方向!

以上是关于集成和核心数据轻迁移的主要内容,如果未能解决你的问题,请参考以下文章

集成流程安全报警功能迁移心得

如果我使用 Core Data 手动迁移,我以后可以集成 iCloud 同步吗?

Drone-比Jenkins更轻量化的持续集成部署工具

Flask框架之数据库迁移集成到Script中

Grails 2.3 迁移脚本不会在集成测试期间运行

核心数据迁移要求