android – 通过REST进行客户端 – 服务器同步

这个问题是关于我认为 Android / iOS开发中一个非常常见的问题,但我还没有找到任何“标准”解决方案.

假设我们有一个相当普通的REST API.服务器数据库包含(以及其他)表格具有1:N关系的国家和城镇.

客户端(移动应用程序)想要维护这两个表的本地快照.因此,当它处于脱机状态时,它可以执行通常通过REST完成的查询,例如:“获取人口> = 100的奥地利城镇列表”?

怎么解决这个问题?

第一个问题:一致性.客户端应该有两个表的快照.如果客户端下载城镇表的更新并下线,则某些城镇可能会引用不在国家/地区表的本地副本中的国家/地区.

第二个问题:客户端应该只下载新的/删除/更改的行.抛弃REST并使用一些自定义RPC调用,如get_updates_since(…)?

第三个问题:如何将客户端数据库副本(可能脱机)的本地更改与服务器同步?自定义RPC调用?

解决方法

我认为没有银弹,但你正在寻找的模式是缓存.在过去的项目中,我将项目从服务器复制到本地存储(SQLite或平面文件),并根据简单的规则维护有关更新/上传/清除条目的元数据.这不是一个简单的问题,最终会成为很多代码.

一致性:在您的示例中,要么确保首先下载countries表,要么使两个操作成为原子 – 例如,制作“新”表的副本,并且只有在两个副本成功完成(存储时加倍)时才替换缓存版本.

只下载新/删除/更改:是的,这需要客户端/服务器集成 – 时间戳所有记录(使用GMT),从服务器请求元数据,并遍历您的本地元数据,决定做什么. (行上的提示UUID很有帮助).

同步本地更改:是,更多客户端/服务器集成.见上段.

处理所有异常和边缘情况具有挑战性.看一下problems with iCloud sync’ing CoreData.也许不是一个公平的比较,因为Apple试图为一个完全分布式的数据库解决这个问题,但仍然有趣的阅读.

相关文章

Android 如何解决dialog弹出时无法捕捉Activity的back事件 在...
Android实现自定义带文字和图片的Button 在Android开发中经常...
Android 关于长按back键退出应用程序的实现最近在做一个Andr...
android自带的时间选择器只能精确到分,但是对于某些应用要求...