fhu*_*cho 6 database rest android synchronization ios
这个问题是关于我认为Android/iOS开发中一个非常常见的问题,但我还没有找到任何"标准"解决方案.
假设我们有一个相当普通的REST API.服务器数据库包含(以及其他)表countries并towns具有1:N关系.
客户端(移动应用程序)想要维护这两个表的本地快照.因此,当它处于脱机状态时,它可以执行通常通过REST完成的查询,例如:"获取人口> = 100的奥地利城镇列表"?
怎么解决这个问题?
第一个问题:一致性.客户端应该有两个表的快照.如果客户端下载towns表的更新并脱机,则某些城镇可能会引用不在countries表的本地副本中的国家/地区.
第二个问题:客户端应该只下载新的/删除/更改的行.抛弃REST并使用一些自定义RPC调用get_updates_since(...)?
第三个问题:如何将客户端数据库副本(可能脱机)的本地更改与服务器同步?自定义RPC调用?
我认为没有银弹,但你正在寻找的模式是缓存.在过去的项目中,我将项目从服务器复制到本地存储(SQLite或平面文件),并根据简单的规则维护有关更新/上传/清除条目的元数据.这不是一个简单的问题,最终会成为很多代码.
一致性:在您的示例中,要么确保首先下载countries表,要么使两个操作成为原子 - 例如,制作"新"表的副本,并且只有在两个副本成功完成时才会替换缓存版本(在存储上加倍).
只下载新/删除/更改:是的,这需要客户端/服务器集成 - 时间戳所有记录(使用GMT),从服务器请求元数据,并遍历您的本地元数据,决定做什么.(行上的提示UUID很有帮助).
同步本地更改:是,更多客户端/服务器集成.见上段.
处理所有异常和边缘情况具有挑战性.看看iCloud同步CoreData的问题.也许不是一个公平的比较,因为Apple试图为完全分布式的数据库解决这个问题,但仍然有趣的阅读.
目前我正在处理相同的任务 - 构建 Android 应用程序,该应用程序将使用Azure 移动服务与中央 SQL 数据库同步信息。同步策略是支持来自多个客户端的双向同步以确保数据一致性,而只会交换增量更改。
让我为您的问题提供我的解决方案。我最近写了一篇关于同步算法的博客文章来支持这种情况。
由于 REST API 通信,同步逻辑将在客户端进行管理。参与同步过程的每个表都会有相应的 REST Api 方法用于 CRUD 操作。
对于您的第一个问题(一致性)– 解决方案是以正确的顺序在客户端下载数据。例如,先是父母,然后是孩子,以避免参照完整性问题。如果出现网络问题,客户端将不得不再次同步以获取其余数据。
第二个问题(仅下载增量更改)——解决方案是时间戳(正如凯文在下面的回答中提到的)。但我建议使用在服务器端维护的全局递增值,以避免客户端和服务器之间的时间戳差异问题。SQL Server 的 rowversion 是非常好的候选者。
第三个问题(来自客户端的数据集成)——在客户端表中使用 Dirty 标志将有助于区分上传所需的记录。
您可能还需要在两侧引入 Delete 标志来处理多个客户端之间的删除。
| 归档时间: |
|
| 查看次数: |
5325 次 |
| 最近记录: |