使用NSPersistentCloudKitContainer同步旧数据

时间:2019-07-03 18:10:27

标签: ios swift core-data cloudkit nspersistentcloudkitcontainer

我正在使用NSPersistentCloudKitContainer通过CloudKit在不同设备之间同步数据。它与新项目完美兼容,但是当我将其与旧项目一起使用时,用NSPersistentContainer添加的旧数据将无法同步。

我想要实现的是在将NSPersistentContainer更改为NSPersistentCloudKitContainer之后,同步添加到function sub() { var txtFirstNumberValue = document.getElementById('AB[]').value; var txtSecondNumberValue = document.getElementById('RAB').value; var resultMul = parseInt(txtFirstNumberValue) * parseInt(txtSecondNumberValue); var textthired = document.getElementById('RQP').value; var result = parseInt(textthired) + parseInt(resultMul); if (!isNaN(result)) { document.getElementById('TA[]').value = result; } }的旧数据。有可能吗?

1 个答案:

答案 0 :(得分:2)

我已经找到了适用于我的Core Data数据库的解决方案-而且我的解决方案非常复杂,具有多个多对多的关系(一个名为Somnus的手术/麻醉日志应用程序)

我首先为我的所有核心数据实体创建了一个名为sentToCloud的新属性,并在核心数据模型中将其默认设置为FALSE

对于现有用户的第一次加载:

  • 使用谓词"sentToCloud == FALSE"提取每种实体类型的请求
  • 将每个对象的sentToCloud更改为TRUE,然后保存MOC
  • 这会触发NSPersistentCloudKitContainer开始同步

我已经按照适用于我的数据库的“优先级”顺序进行了此操作,假设iCloud同步会话与修改核心数据的顺序相匹配。在我的测试中,似乎是这样:

  • 我首先同步所有子(或大多数子类)实体
  • 然后在树上同步他们的父母,等等
  • 一旦其他所有内容都放置到位,以便用户之间的关系完好无损,并且在我们等待NSPersistentCloudKitContainer重新连接所有关系时,他们不会认为自己的数据很闷,我会最后同步用户与之交互的对象。
  • 我还保留了所有二进制数据(神奇地变成了CKAsset的幕后花絮),因为它不是我数据库中最重要的部分

我的数据库已成功从iPad同步到iPhone,所有关系和二进制数据均显示正确。

现在,我需要的是一种告诉用户何时同步数据(和/或某种进度)并让他们完全关闭数据的方法。

添加

因此,在重置iCloud仪表板上的所有数据并删除iPhone和iPad上的应用程序之后,我再次尝试了此操作。

第二次仅同步了一些数据。似乎在处理大型同步请求时仍然有问题(控制台中有很多.limitExceeded CKErrors。)

令人沮丧的是,目前尚不清楚是否中断了要重试的请求-我认为不是。我将其放置了一整夜,仍然没有进一步同步,只有更多.limitExceeded CKErrors。

也许这就是为什么他们不想同步现有数据的原因?

我个人认为这很愚蠢。有时,用户将对其数据执行批处理,这将涉及一次动作更新数千个Core Data对象。如果这只会卡在.limitExceeded CKErrors中,那么NSPersistentCloudKitContainer不会是一个很好的同步解决方案。

他们需要一种更好的方式来处理这些错误(将请求分解为较小的请求),还需要能够查看正在发生的事情(并可能向用户呈现一些UI)。

我真的需要这项工作,因为就目前情况而言,无法使用CloudKit同步多对多核心数据关系。

我只是希望他们仍在研究该类并对其进行改进。