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

时间:2013-02-11 07:47:54

标签: php android iphone codeigniter zend-framework

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

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

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

  3. 使用Restful Web服务执行该操作的最佳方法是什么

1 个答案:

答案 0 :(得分:0)

有几个选项,几乎没有详尽的清单,但更多的例子可以开始思考;

  • 要优化版本1,您可以在服务器端创建一个触发器,用于更新已更改行的版本字段。这样,如果客户端知道它具有版本47并且服务器具有版本52,则您知道您只需要发送版本号在48到52之间的行以使客户端保持最新。如果更新主要是逐行更新,而不是“将所有绿色行更新为puce”仍会发送大量数据,则效果最佳。

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

  • 将对数据库的操作分解为业务操作并发送它们。例如,业务操作可以是“付款:User2,$ 47”,操作本身被发送到客户端,然后您将“付款”映射到数据库中的更新。这将需要操作的数量相当小和定义(尽管尝试定义它们很少是一个坏主意),但是同时适用于逐行和全面更新并且可能使用最少量的数据来获取内容最多同步(如果您对操作进行编号,以便在客户端尚未收到它们时只发送一次)它还会免费提供审核日志,用户余额不仅仅会更改,您知道制作了什么它改变了。

就个人而言,如果我有选择,我会选择3,因为我想知道数据库更新实际上是什么意思意味着以及何时完成,但是对于现有系统来说,这可能太过分了工作