使用SqLite在移动应用程序上实现离线访问的最佳方式


Best way to implement offline access on mobile applications with SqLite

我们有一个移动应用程序(Android和iPhone),需要执行离线访问。我想知道什么是在应用程序端以更精简的方式更新SqLite数据库的最佳方式。

  1. 我发现的一种方法是通过web服务以JSON格式发送所有对象,并进行时间戳检查以查看是否有更新。如果有更新,所有的表都会被截断并再次插入到应用程序端。我觉得效率很低。

  2. 另一种方法是通过web服务发送sql语句(用JSON封装)。第一次发送所有插入记录时,如果有新记录或更新,则插入记录并更新记录。我觉得这种方法很不安全。

使用Restful Web服务执行此操作的最佳方式是什么

有几个选项,虽然不是一个详尽的列表,但更多的例子可以让你开始思考;

  • 要优化版本1,您可以在服务器端创建一个触发器,用于更新更改行的版本字段。这样,如果客户端知道它的版本是47,而服务器的版本是52,那么你就知道你只需要发送版本号在48到52之间的行就可以让客户端更新。如果更新大多是逐行进行的,而不是"将所有绿色行更新到puce"(这仍然会发送大量数据),则效果最好。

  • 为了使版本2更加安全,您可以发送除表名之外的所有SQL,从而锁定对特定操作(例如UPDATE/INSERT/DELETE,无SELECT)和特定表(即不对同一数据库中的其他表进行更新)的更改。维护起来可能有点困难,但如果数据库的大部分可能受到单个UPDATE的影响,效果会更好。

  • 将对数据库的操作分解为业务操作,然后发送这些操作。例如,一个业务操作可能是"Payment-maned:User2,$47",操作本身被发送到客户端,然后您将"Payment-Maned"映射到数据库中的更新。这将需要操作的数量相当小并且被定义(尽管无论如何尝试定义它们都不是一个坏主意),但与逐行更新和全面更新都能很好地配合使用,并且可能会使用最少的数据来进行同步(如果你对操作进行编号,以便在客户端尚未收到操作的情况下只发送一次)。它还免费为你提供审计日志,用户余额不仅发生了变化,你知道是什么让发生了变化。

就我个人而言,如果有选择的话,我会选择选项3,因为我想知道数据库更新的实际含义以及何时完成,但对于现有系统来说,这可能太多工作了。