ios - Simperium 在向实体添加新属性时丢失数据

标签 ios core-data migration simperium

我读过 in another answer Simperium 应该能够很好地处理核心数据轻量级迁移。但是,我目前正在努力解决向现有实体添加(可选)属性的简单情况。

为了使问题更容易理解,我们来看一个例子。假设我以前的应用程序版本是 1.0,新版本 1.1 在核心数据实体上引入了一个新属性 foo

现在,让我们考虑这个场景:

  1. 设备 A 和 B 都运行 1.0 版并连接到同一个 Simperium 同步帐户,两者都是最新的。
  2. 设备 A 升级到 1.1 版,在数据库中创建属性,用户向新的 foo 属性添加一些数据。此数据已正确同步到 Simperium 后端,并且 foo 在网络数据浏览器中可见。
  3. 设备 B(仍在 1.0 版,即没有 foo)与 Simperium 同步。此时我看到 Simperium warning: applyDiff for a member that doesn't exist,这是可以理解的,因为 foo 不存在。这里的一切都如期而至。
  4. 现在设备 B 升级到 1.1。第一次启动应用程序时,Core Data 会创建新的 foo 列。但是,既然 foo 属性存在,Simperium 仍然不会从后端提取数据,因此设备 A 和 B 看不到 foo 的相同数据!

我理解为什么会发生这种情况(Simperium 第一次放弃了更改,因为该属性还不存在,然后在可能的时候不再应用相同的更改)。但是,我认为这是一个很大的问题,即使是对数据模型进行最简单的更改也会使风险很大。我在这里错过了什么吗?向实体添加新属性的安全方法是什么?

最佳答案

抱歉,我们花了一些时间才回复(请务必随时在 Github 上打开问题!)。

目前,在迁移方面几乎没有什么注意事项。

我已经提交了 this issue ,以正确处理新属性场景,以及 this issue处理属性重命名。

现在,虽然协议(protocol)是有弹性的,并且同步应该自行恢复(万一发生某些事情,客户端不同步,即迁移),属性重命名会导致故障。

目前,恐怕处理迁移最简单//最安全的方法是创建另一个具有所需属性集的存储桶。

对于给您带来的不便,我们深表歉意,我们将对此进行迭代!

关于ios - Simperium 在向实体添加新属性时丢失数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32613379/

相关文章:

ios - 快速显示数学

ios - Swift CoreData——无法将类型 'Int' 的值分配给类型 'Int16'

mysql - 创建新列,并按其顺序递增

java - 从 Java 7 迁移到 12 时如何找到替换包?

mysql - SQL Server 2008 的 ADDTIME 和 SEC_TO_TIME

ios - 来自外部类的 addTarget

ios - 何时在属性声明中使用 "assign"或 "retain"?

ios - 从异步回调更新 UI 的问题

ios - NSFileManager 的 moveItemAtPath 是否为 :toPath:error method load the file being moved into memory?

iphone - 实时应用程序中的核心数据更新