android - 基于 REST 的客户端-服务器同步

标签 android ios database rest synchronization

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

假设我们有一个相当普通的 REST API。服务器数据库包含(除其他外)具有 1:N 关系的表 countriestowns

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

如何解决这个问题?

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

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

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

最佳答案

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

一致性:在您的示例中,要么确保首先下载国家/地区表,要么使这两个操作成为原子操作 - 例如,制作"new"表的副本,并且仅在两个副本都成功完成时才替换您的缓存版本(加倍存储)。

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

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

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

关于android - 基于 REST 的客户端-服务器同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18750301/

相关文章:

从 Javascript 调用 Android 方法时的 Android 'CalledFromWrongThreadException'

ios - 缩放 UIImage/CGImage

java - 如何替换字符串中的指定空格?

android - 由 : android. view.InflateException: Binary XML file line #1: Error inflating class fragment 引起

ios - 基于 textField 将新 key 写入 .plist 文件

php - PDO:lastInsertId返回什么值?

mysql - SQL Join 来自另一个表的数据计数

mysql - ALTER 查询不起作用

android - System.InvalidCastException : Specified cast is not valid on editText. AddTextChangedListener

ios - For-in 循环需要 'JSON?' 才能符合 'Sequence' ;你的意思是打开可选的吗?