2012-02-29 77 views
6

我们有一个android应用程序和一个iPhone应用程序(相同的功能),使用sqlite本地数据存储。应用程序最初没有数据,然后在第一次运行时,它们从远程服务器接收数据并将其存储在sqlite数据库中。 sqlite数据库由服务器创建,应用程序将其作为一个文件下载,然后用于购买应用程序。按照今天的标准,数据库文件不是很大,但也不是很小 - 大约5-6 MB。同步/更新sqlite数据库

现在,有一段时间,应用程序需要刷新服务器中的数据。有几种方法可以考虑:

  1. 从服务器下载新的完整数据库并替换现有的数据库。这听起来像是处理这个问题最简单的方法,不是因为重复5-6 MB的下载。这些应用程序确实会提示用户是否要下载更新,因此这可能不是太大问题。

  2. 从服务器上下载增量数据库,其中只包含新的/修改的记录,并以某种形式提供有关要删除哪些记录的信息。这将导致更小的下载量,但客户端的工作更复杂。我需要读取一个数据库,并根据读取的内容更新另一个数据库。据我所知,没有办法用sqlite来做类似insert into db1.table1 (select * from db2.table1)的地方,其中db1db2是两个包含结构相同的table1的sqlite数据库。 (完整的sqlite数据库包含大约10个表,最大的可能包含约500个记录左右)。

  3. 下载某些其他格式(json,xml等)中的数据增量并使用此信息更新应用程序中的数据库。与以前一样:在服务器端没有太多问题,比完整的数据库更小的下载大小,但是执行更新是一个非常痛苦的过程。

您推荐三种方法中的哪一种?或者,也许还有另一种我错过的方式?

非常感谢提前。

+0

https://stackoverflow.com/questions/4008015/android-sqlite-bidirectional-synchronization-sqlite – 2017-07-01 03:39:52

回答

1

经过很多考虑和尝试错误,我去了选项(2)和(3)的组合。

  1. 如果没有数据存在的话,那么该应用程序从服务器下载完整的数据库文件。

  2. 如果数据存在并且需要更新,应用程序会从服务器下载一些数据库。并检查特定表中特定值的内容。该值将说明新数据库是否替换原有的或是否包含删除/更新/插入

这原来是最快的方式(性能明智),并留下所有繁重的任务(确定是否将所有内容放入一个数据库或只是更新)到服务器。此外,通过这种方法,如果我需要修改算法,比如说总是下载完整的数据库,那么只需要在服务器上进行更改,而无需重新编译和重新分发应用程序。

+0

你可以发布任何样本或教程吗? – 2012-12-07 02:59:43

+0

我还想看到一些示例 - 我试图同步sqlite数据库 - 存储在Google Drive上的一个中央数据库以及存储在各个Android设备(可能不总是可以访问互联网)上的任意数量的脱机数据库。 – Rohaq 2013-03-10 20:45:48

+0

@Rohaq如果设备无法访问互联网,则无法同步任何内容。就我而言,同步始终是一种方式 - 从服务器到设备 - 数据库的结构不会改变,只有数据。 – 2013-03-11 09:04:28

-1

我会推荐方法3,因为应用程序会更快地下载json文件,并且更容易更新本地数据库,避免更多互联网使用的开销。

最初只是创建一个空的数据库,根据服务器的数据库,然后通过获取JSON定期更新一样

+2

我不确定你的“更快地下载json文件”的措辞。我做了一些测试/原型设计:当完整的数据库大小约为5 MB时,包含所有数据的json文件大约为8 MB。除了大小的1.5倍之外,解析这样一个巨大的json也可能非常耗时。 – 2012-02-29 13:24:02

+0

json将以字段名和值的形式包含各个表的所有记录。另外,每个表将会有多个json,这些json将分开提取。 – Maneesh 2012-02-29 13:29:25

+1

好的,在这种情况下,我看不出从服务器下载完整的数据库效率如何。 – 2012-02-29 13:33:58

0

有没有一种方法,你可以为每个表的JSON场?例如,如果你有一个名为users的表,那么有一个名为“json”的列来存储每个用户的JSON。实质上,它将包含其余字段所具有的信息。

因此,当您以JSON下载增量时,您所要做的就是将JSON插入到表中。

当然,使用这种方法,您需要额外的工作来解析JSON并从中创建模型/对象,但它只是一个额外的3-4个小步骤。

+0

这并不像听起来那么简单。数据库中的表与外键链接,因此一个表中的数据本身没有意义,没有其他表中的数据。数据真的需要全部在一起。当我查询数据时,我使用连接来获取所需的信息。 – 2012-02-29 15:31:56