【问题标题】:Android: How to synchronize database entries between Client and serverAndroid:如何在客户端和服务器之间同步数据库条目
【发布时间】:2014-04-08 09:53:19
【问题描述】:

我有一个 android 应用程序,它需要从运行 MySQL 数据库的服务器获取新数据。我通过我的domain.com/mypanel/ 在线访问的面板将数据添加到数据库。

在客户端上获取数据以减少开销的最佳方式是什么,但要尽可能减少编程工作量。客户端不需要在更新后立即获取最新的数据库更改,即,如果客户端在更新后几个小时更新就可以了。

目前我想到了以下几点:

  1. timestamp 列添加到数据库表中,以便我知道进行了哪些更改
  2. 在客户端(在应用程序中)运行某种后台服务,每 X 小时运行一次,然后检查自上次成功的服务器-客户端同步以来的最新更新
  3. 使用 HTTP-POST 将时间间隔发送到客户端不再有任何更新的服务器
  4. 在服务器上,会有某种 MySQL SELECT-statement 考虑发送的时间间隔(如果没有从客户端发送的时间间隔,只需选择所有内容,例如在第一次同步的情况下(full-sync)) --> JSON 编码数组 -> 将 JSON 响应发送到客户端
  5. 在客户端,取数据,逐行循环插入到本地数据库文件中

我的问题是:

有什么你宁愿做不同的事情吗? 或者您可能会将数据库更改作为整个包/sql 文件而不是原始数据作为数组发送?

如果在同步期间互联网连接中断,会发生什么情况?我想到了以下方法来避免此类过程中的任何冲突:只有在成功检索完整的服务器响应(即完整的 JSON 数组)之后,ONLY 然后将行插入本地数据库并将本地更新时间戳更新为实际时间。如果我只检索了一些 JSON 行并且 Internet 连接在其间中断(或应用程序被终止),我不会将任何检索到的行插入到我的本地应用程序数据库中,这意味着下一次后台服务正在运行,希望不会有冲突。

非常感谢

【问题讨论】:

  • SQLite 事务支持很棒 - 使用它并且不用担心同步失败等。
  • 您能详细说明一下吗?是否可以将事务连接到服务器端的 PHP 脚本!?
  • @blue:你能告诉我更多吗?

标签: php android mysql json client-server


【解决方案1】:

你在客户端提到了database,我猜数据库是 SQLite。

SQLite fully supports transaction,这意味着您可以将插入内容包装在 BEGIN TRANSACTION 和 END TRANSACTION 语句中。成功的交易意味着您的所有插入/更新/删除都很好。

选择 JSON 有很多优点和一些缺点 - 客户端和服务器端都很容易。我过去一直在苦苦挣扎的一个缺点是大型 JSON(几 Mb​​)。客户端设备必须下载所有字符串并立即对其进行解析,因此在将字符串转换为 JSONObject 时可能会耗尽内存。我去过那里,所以请记住这一点。这可以通过将您的更新分成几部分并用它的数量和总数量标记每个部分来解决。然后客户端设备应该知道它会发出一些请求来获取所有部分。

您的另一个选择是旧的 CSV。您不需要 JSON 包含,这将为您的应用节省一些空间。好处是您可以逐行解析和处理数据,因此对内存的影响会非常低。这里明显的缺点是您必须解析数据,这可能是个问题,具体取决于您的数据。

我还应该提到 XML 作为一个选项。我个人的看法是,只有在真的需要时才会使用。

【讨论】:

  • 关于 CSV 的好主意,是的,为什么不呢。我想我的数据相当“简单”,因此可以方便地逐行解析。关于将数据分成块:我牢记在心。通过将另一个 POST 参数(类似于分页实现)传递给 php 脚本产生实际的块索引然后使用 mysqls LIMIT :-) EDIT应该不会太难做到>:为了验证服务器客户端之间数据的完整性,我想到了md5-hashing数据
猜你喜欢
  • 1970-01-01
  • 2012-09-26
  • 2020-03-08
  • 1970-01-01
  • 2014-10-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-03
  • 1970-01-01
相关资源
最近更新 更多