【发布时间】:2016-06-30 13:22:43
【问题描述】:
这个问题已经被问过很多次了,但我一直找不到完整的答案。我需要使用 sqlite3 数据库将数据存储在我的应用程序中,并且核心数据不是一个选项。我想使用 iCloud 跨设备同步数据,最好的方法似乎是将 SQL 事务日志发送到 iCloud 并使用它们来保持设备最新。到目前为止我想出的过程如下:
- 所有数据库更改查询(INSERT、UPDATE、DELETE)在执行后都存储在事务数组中,其中每个元素都包含 sql 查询及其执行的时间戳
- 数据库包含一个表,用于记录应用程序最后到达的事务数组中的点(包括存储在 iCloud 上的事务文件的文件名)
- 事务数组保存到 iCloud 上的设备唯一文件
- 同步时:
- 从 iCloud 获取交易文件数组
- 创建要提交的事务的空数组
- 对于每个文件:
- 检查数据库以获取事务文件中的最后一个位置
- 如果没有,则从文件开头开始
- 将每个事务从该点添加到要提交的事务数组中
- 使用事务文件的新最后位置更新数据库,以免重复同步事务
- 按事务时间戳对要提交的事务数组进行排序
- 执行要提交的事务数组中的命令
我相信我可以通过将数据下拉到每个设备并执行命令来更新每个本地副本来完成这项工作。我设想的唯一问题是,如果两个设备在脱机然后同步时将记录插入同一个表。例如:
- 设备 1 和设备 2 都有同步的数据库副本,表“table1”中各有 4 条记录
- 设备 1 使用 PK 5 将值“foo”插入表“table1”
- 设备 2 使用 PK 5 将值“bar”插入表“table1”
- 设备 1 下载设备 2 的事务日志并将值“bar”插入 ID 6
- 设备 2 下载设备 1 的事务日志并将值“foo”插入 ID 6
我们现在遇到这样一种情况,即这些记录的主键在每台设备上都被反转,这将破坏到依赖主键进行链接的表的链接。
我仍在尝试研究解决此问题的方法,但与此同时,如果有人有任何建议,我将不胜感激!
【问题讨论】:
标签: ios sqlite synchronization icloud