我有一个android应用程序,它需要从运行MySQL数据库的服务器获取新数据。我通过一个面板将数据添加到数据库中,这个面板可以在线访问我的domain.com/mypanel/
。
在客户机上获取数据以减少开销的最佳方法是什么,但要尽量减少编程工作量。客户机不必在数据库更新后立即获取最新的数据库更改,也就是说,如果客户机在更新后的几个小时内更新,就可以了。
目前我想到了以下几点:
向数据库表中添加一列timestamp
,以便我知道已进行了哪些更改
在客户端(应用程序中)上运行某种后台服务,该服务每X小时运行一次,然后检查自上次成功的服务器客户端同步以来的最新更新
使用HTTP-POST将时间间隔发送到客户端不再有任何更新的服务器
在服务器上,将有某种MySQLSELECT
-语句考虑发送的时间间隔(如果没有从客户端发送的时间间隔,只需选择所有内容,例如,在第一次同步(完全同步)的情况下)-->JSON对数组进行编码->将JSON响应发送到客户端
在客户机上,获取数据,逐行循环并插入到本地数据库文件中
我的问题是:
有什么事你宁愿做得不同吗?
或者您可以将数据库更改作为一个完整的包/sql文件而不是原始数据作为数组发送吗?
当同步过程中internet连接中断时,会发生什么情况?为了避免这种过程中的任何冲突,我考虑了以下几点:只有在成功检索到完整的服务器响应(即完整的JSON数组)之后,才将行插入本地数据库,并将本地更新时间戳更新为实际时间。如果我只检索到一些JSON行,并且internet连接在中间中断(或者应用程序被终止),我就不会将检索到的任何行插入到本地应用程序数据库中,这意味着下次运行后台服务时,希望不会有冲突。
非常感谢你
最佳答案
你在客户端提到过database
,我猜数据库是SQLite。
SQLite fully supports transaction,这意味着您可以在BEGIN TRANSACTION和END TRANSACTION语句中包装插入。成功的事务意味着所有的插入/更新/删除都是正常的。
选择JSON有很多起伏-客户端和服务器端都很容易。我过去一直在努力的一个缺点是使用大的json(几Mb)。客户端设备必须下载所有字符串并立即对其进行解析,因此在将字符串转换为JSONObject时可能会耗尽内存。我去过那里,所以请记住这一点。这可以通过将您的更新分割为多个部分并用其数量和总数量标记每个部分来解决。然后客户端设备应该知道它会发出一些请求来获取所有的片段。
另一个选择是好的旧CSV。您不需要JSON includes,这将为您的应用程序节省一些空间。一个好处是可以逐行分析和处理数据,因此内存影响非常小。这里明显的缺点是您必须解析数据,这可能是一个问题,这取决于您的数据。
我还应该提到XML作为一个选项。我个人的看法是,只有在我真的需要的时候我才会使用。