同步/更新sqlite数据库

6
我们有一个 Android 应用和一个 iPhone 应用(相同的功能),使用 sqlite 进行本地数据存储。这些应用程序最初没有任何数据,然后在第一次运行时从远程服务器接收数据并将其存储在 sqlite 数据库中。sqlite 数据库由服务器创建,并且应用程序下载它作为一个文件,然后使用该文件。按今天的标准,数据库文件不是非常大,但也不是很小 - 大约 5-6 MB。
现在,偶尔应用程序需要从服务器刷新数据。有几种方法可以考虑:
1.从服务器下载一个新的完整数据库,并替换现有的数据库。如果不重复下载 5-6 MB 的文件,这听起来是解决问题最简单的方法。应用程序会提示用户是否要下载更新,因此可能并不是太麻烦。
2.从服务器下载 delta 数据库,仅包含新/修改的记录以及有关要删除哪些记录的信息。这将导致更小的下载大小,但客户端的工作更加复杂。我需要读取一个数据库,并根据所读内容更新另一个数据库。据我所知,使用 sqlite 没有办法做类似于“insert into db1.table1 (select * from db2.table1)”的操作,其中 db1 和 db2 是包含相同结构的 table1 的两个 sqlite 数据库。(完整的 sqlite 数据库包含大约 10 张表,最大的表可能包含大约 500 条记录左右。)
3.以其他格式(json、xml 等)下载数据差异,并使用此信息更新应用程序中的数据库。与前面一样:服务器端没有太多问题,比完整数据库大小更小的下载大小,但更新过程相当繁琐。
你推荐哪种方法?或者也许有我错过的另一种方法?
非常感谢您的帮助。

https://dev59.com/BW865IYBdhLWcg3wEKSZ - Bernardo Ramos
3个回答

1
经过多次考虑和尝试,我选择了选项(2)和(3)的组合。
  1. 如果根本没有数据,则应用程序从服务器下载完整的数据库文件。

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

这被证明是最快的方法(在性能方面),并将所有繁重的工作(确定是否将所有内容放入一个数据库或仅进行更新)留给服务器。此外,采用这种方法,如果我需要修改算法以始终下载完整的数据库,那么只需在服务器上进行更改,而无需重新编译和重新分发应用程序。


1
你能发布一些示例或教程吗? - Nam Vu
我也想看一些例子 - 我正在尝试同步SQLite数据库 - 一个存储在Google Drive上的中央数据库,以及存储在各个Android设备上的任意数量的离线数据库(这些设备可能并不总是有互联网访问权限)。 - Rohaq
@Rohaq 如果设备没有接入互联网,你就无法同步任何东西。在我的情况下,同步始终是单向的 - 从服务器到设备 - 数据库的结构不会改变,只有数据会发生变化。 - Aleks G
@AleksG 在这种情况下,它仍然是单向同步,但来自多个来源。问题在于当两个设备冲突时,即两个设备对同一行数据进行更改时。有什么建议吗? - Rohaq
@Rohaq,这并没有简单的答案。你需要根据你的场景和需求来决定该怎么做。 - Aleks G

0

你能为每个表格都有一个JSON字段吗?例如,如果你有一个名为“users”的表格,那么就有一个名为“json”的列,用于存储每个用户的JSON。实质上,它将包含其余字段所包含的信息。

因此,当你下载JSON中的增量数据时,你只需要将JSON插入到表格中即可。

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


这并不像听起来的那么简单。数据库中的表通过外键链接在一起,因此一个表中的数据没有其他表的数据几乎没有意义。数据确实需要全部在一起。当我查询数据时,我使用连接操作获取所需的信息。 - Aleks G

-1
我会推荐第三种方法,因为应用程序将更快地下载JSON文件,并且本地数据库将更容易更新,避免了更多的互联网使用开销。
只需根据服务器数据库创建一个空数据库,然后定期通过获取JSON来更新相同的数据库。

2
我不确定你所说的“更快地下载JSON文件”的措辞是否准确。我进行了一些测试/原型设计:虽然完整的数据库大约为5 MB,但包含所有数据的JSON文件大约为8 MB。除了大小增加了1.5倍之外,解析这样一个巨大的JSON文件也可能非常耗时。 - Aleks G
Json 将以字段名称和值的形式包含各个表格的所有记录。此外,每个表格将有多个 Json 文件,需要分别获取。 - Maneesh
1
好的,在这种情况下,我看不出它将比从服务器下载完整数据库更有效率。 - Aleks G
在所有三种方法中,一次性下载数据库可能会有一些时间差异,但是对于定期更新数据库来说,第三种方法会更好。 - Maneesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接