这个问题是关于我认为 Android / iOS 开发中非常常见的问题,但我还没有找到任何“标准”解决方案。
假设我们有一个相当普通的 REST API。服务器数据库包含(除其他外)表countries
and towns
具有 1:N 关系。
客户端(移动应用程序)想要维护这两个表的本地快照。这样,当它处于离线状态时,它可以执行通常通过 REST 完成的查询,例如:“获取人口 >= 100 的奥地利城镇列表”?
如何处理这个问题?
第一个问题:一致性。客户端应该有两个表的快照。如果客户端下载了更新towns
表并离线,某些城镇可能会引用不在本地副本中的国家/地区countries
table.
第二个问题:客户端应该只下载新的/删除的/更改的行。放弃 REST 并使用一些自定义 RPC 调用,例如get_updates_since(...)
?
第三个问题:对客户端数据库副本的本地更改(可能是离线的)应如何与服务器同步?自定义 RPC 调用?
我不认为有什么灵丹妙药,但您正在寻找的模式是缓存。在过去的项目中,我将项目从服务器复制到本地存储(SQLite 或平面文件),并根据简单的规则维护有关要更新/上传/清除的条目的元数据。这不是一个简单的问题,最终会产生大量代码。
一致性:在您的示例中,要么确保首先下载国家/地区表,要么使这两个操作原子化 - 例如,制作“新”表的副本,并且仅在两个副本都成功完成时才替换缓存的版本(存储量加倍)。
仅下载新的/删除的/更改的:是的,这需要客户端/服务器集成 - 为所有记录添加时间戳(使用 GMT),从服务器请求元数据,并遍历本地元数据来决定要做什么。 (行上的提示 UUID 很有帮助)。
同步本地更改:是的,更多的客户端/服务器集成。参见上段。
处理所有异常和边缘情况具有挑战性。看看iCloud 同步 CoreData 的问题 http://www.theverge.com/2013/3/26/4148628/why-doesnt-icloud-just-work。也许这不是一个公平的比较,因为苹果正在尝试解决这个完全分布式数据库的问题,但尽管如此,读起来还是很有趣。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)