Simperium 在向实体添加新 属性 时丢失数据
Simperium loses data when adding a new property to an entity
我读过 in another answer Simperium 应该能够很好地处理核心数据轻量级迁移。但是,我目前正在努力解决向现有实体添加(可选)属性 的简单情况。
为了让问题更容易理解,我们来看一个例子。假设我以前的应用程序版本是 1.0,新版本 1.1 在核心数据实体上引入了新的 属性 foo
。
现在,让我们考虑这个场景:
- 设备 A 和 B 都是 运行 版本 1.0,并且连接到同一个 Simperium 同步帐户,都是最新的。
- 设备A升级到1.1版本,在数据库中创建了属性,用户在新的
foo
属性中添加了一些数据。此数据已正确同步到 Simperium 后端,并且 foo
在网络数据浏览器中可见。
- 设备 B(仍在 1.0 版,即没有
foo
)与 Simperium 同步。此时我看到 Simperium warning: applyDiff for a member that doesn't exist
,这是可以理解的,因为 foo
不存在。这里的一切都如期而至。
- 现在设备B升级到1.1。第一次启动应用程序时,Core Data 会创建新的
foo
列。但是,既然 foo
属性 已经存在,Simperium 仍然不会从后端提取数据,因此设备 A 和 B 看不到 foo
的相同数据!
我明白为什么会发生这种情况(Simperium 第一次放弃了更改,因为 属性 还没有,然后在可能的时候不再应用相同的更改)。但是,我认为这是一个很大的问题,即使是对数据模型进行最简单的更改也会使风险很大。我在这里错过了什么吗?向实体添加新 属性 的安全方法是什么?
抱歉,我们花了一些时间才回复(请务必随时在 Github 上打开一个问题!)。
目前,关于迁移的注意事项很少。
我已提交 this issue, to properly handle the New Attributes scenario, and this issue 处理属性重命名。
现在,尽管协议是有弹性的,并且同步应该会自行恢复(万一发生某些事情,并且客户端不同步,即迁移),属性重命名会导致故障.
目前,处理迁移的最简单//最安全的方法恐怕是创建另一个具有所需属性集的存储桶。
对于给您带来的不便,我们深表歉意,我们将对此进行迭代!
我读过 in another answer Simperium 应该能够很好地处理核心数据轻量级迁移。但是,我目前正在努力解决向现有实体添加(可选)属性 的简单情况。
为了让问题更容易理解,我们来看一个例子。假设我以前的应用程序版本是 1.0,新版本 1.1 在核心数据实体上引入了新的 属性 foo
。
现在,让我们考虑这个场景:
- 设备 A 和 B 都是 运行 版本 1.0,并且连接到同一个 Simperium 同步帐户,都是最新的。
- 设备A升级到1.1版本,在数据库中创建了属性,用户在新的
foo
属性中添加了一些数据。此数据已正确同步到 Simperium 后端,并且foo
在网络数据浏览器中可见。 - 设备 B(仍在 1.0 版,即没有
foo
)与 Simperium 同步。此时我看到Simperium warning: applyDiff for a member that doesn't exist
,这是可以理解的,因为foo
不存在。这里的一切都如期而至。 - 现在设备B升级到1.1。第一次启动应用程序时,Core Data 会创建新的
foo
列。但是,既然foo
属性 已经存在,Simperium 仍然不会从后端提取数据,因此设备 A 和 B 看不到foo
的相同数据!
我明白为什么会发生这种情况(Simperium 第一次放弃了更改,因为 属性 还没有,然后在可能的时候不再应用相同的更改)。但是,我认为这是一个很大的问题,即使是对数据模型进行最简单的更改也会使风险很大。我在这里错过了什么吗?向实体添加新 属性 的安全方法是什么?
抱歉,我们花了一些时间才回复(请务必随时在 Github 上打开一个问题!)。
目前,关于迁移的注意事项很少。
我已提交 this issue, to properly handle the New Attributes scenario, and this issue 处理属性重命名。
现在,尽管协议是有弹性的,并且同步应该会自行恢复(万一发生某些事情,并且客户端不同步,即迁移),属性重命名会导致故障.
目前,处理迁移的最简单//最安全的方法恐怕是创建另一个具有所需属性集的存储桶。
对于给您带来的不便,我们深表歉意,我们将对此进行迭代!