Android:如何在客户端和服务器之间同步数据库条目

时间:2014-04-08 09:53:19

标签: php android mysql json client-server

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

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

目前我想到了以下内容:

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

    您是否愿意采取不同的做法? 或者您是否可以将数据库更改作为整个package / sql-file而不是raw-data作为数组发送?

    当同步期间互联网连接中止时会发生什么?我想到了以下内容以避免此类过程中的任何冲突:只有在成功检索完整的服务器响应(即完整的JSON阵列)后,才会将行插入本地数据库并将本地更新时间戳更新为实际时间。如果我只检索了一些JSON行并且互联网连接在中间被中断(或者应用程序被杀死),我就不会将任何检索到的行插入我的本地应用程序数据库,这意味着下一个在后台服务运行的时候,希望没有冲突。

    非常感谢

1 个答案:

答案 0 :(得分:1)

您在客户端上提到了database,我的猜测是数据库是SQLite。

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

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

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

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