这个问题以前曾被问过很多次,但我一直无法找到完整的答案。我需要使用sqlite3数据库在我的应用程序中存储数据,并且核心数据不是一个选项。我想使用iCloud跨设备同步数据,最好的方法是将SQL事务日志发送到iCloud并使用它们来保持设备最新。到目前为止,我提出的流程如下:
我相信我能够将数据提取到每个设备并执行更新每个本地副本的命令。我设想的唯一问题是两个设备是否在同一个表中插入记录,同时脱机然后同步。例如:
我们现在遇到这样一种情况,即每个设备上的这些记录的主键都被反转,这将破坏依赖主键进行链接的表的链接。
我仍在尝试研究解决方案,但与此同时,如果有人提出建议,我将非常感激!
答案 0 :(得分:0)
我一整天都在考虑这个问题,我想我已经找到了解决方案。我在这里发帖,看看是否有人有任何意见,我明天就会去实施。
我的想法是取消自动增量,整数主键并将其替换为基于字符串的键。密钥将从设备的UUID和时间戳生成。这意味着密钥是特定于设备和行唯一的。因此,使用此方法重新编写上面的INSERT示例(使用简化的键字符串以便于阅读):
这是有效的,因为设备知道事务将导致他插入使用设备特定值键入的行。因此,在插入操作之后,键列中没有重复值的危险。
欢迎任何关于这种方法的想法!
UPDATE 我将此标记为正确答案,因为它有效。以下是我如何修改现有数据库(和应用程序)以允许跨设备进行同步。幸运的是,这不是一个生产应用程序,所以对数据库进行的重大更改并没有引起问题。
关于这个过程的实现,我已经到了第5步。所有iCloud特定的东西都没有实现。但是,我已经通过在运行应用程序副本的设备之间手动复制事务日志来测试该过程,我可以确认该过程有效。包含设备的UUID的TEXT主键确保不会发生冲突。所有设备都可以插入彼此的数据,并且密钥始终是唯一的。
这样做的缺点是数据库会更大(因为密钥长于整数),并且由于涉及大量字符串比较,查询可能需要更长时间。但是,我使用的数据库相对较小,每个用户交互只有几个查询,所以我不认为这里有问题。
我希望这对其他提出相同问题的人有用:)