有没有办法从SQLite中提取查询?

时间:2013-03-19 09:00:33

标签: android sqlite android-sqlite

我正在尝试创建某种备份&恢复我的应用程序中的功能在此之前,我已经阅读了一段时间才能理解是否可以实现,但我发现了这个问题: Sqlite DB Android Backup/Restore

  

我能看到的另一种方法是读取数据库的实际内容并生成一个包含SQL的文件,它可以从中恢复,这显然更复杂,不提供任何有利于证明这种复杂性的好处。

我认为,这个答案是实现这一目标的最佳方式;不是在探索.db文件,而是导出查询。

你知道;当您从mysql导出SQL数据时,您将获得一个文件,其中包含创建结构的所有查询以及使用数据填充结构的查询。

这就是我想要模仿的东西;生成一个包含来自.db文件的SQL查询的文件。

你们认为有可能,我的意思是,是否有任何内置方法可以实现这一目标?

否则,如果它太难处理,你如何设法避免这个用户(https://stackoverflow.com/a/10842043/1943607)在谈论什么?

  

所以,我用“PRAGMA journal_mode = DELETE”禁用了WAL,然后我就能在浏览器中查看数据库并能够在我的测试设备上恢复它。

前一部分,我无法理解。这是你设置为sqlite的配置吗?

由于

3 个答案:

答案 0 :(得分:1)

我实际上没有用sqlite尝试过这个,但是使用mysql你可以做一些事情,比如创建数据库的“转储”。这些转储包含您所描述的内容:一组查询,一起执行时,重新创建数据库,包括内容。

根据http://www.sqlite.org/sqlite.html中的“sqlite3”文档(尤其是“将整个数据库转换为ASCII文本文件”部分)判断,您可以对sqlite执行相同的操作。由于您可以从java应用程序执行shell命令(使用Runtime.getRuntime()。exec()方法),并且您是数据库的“所有者”(Linux用户ID),因此您应该能够运行此“sqlite3”。甚至在非root设备上转储“命令”。我从未见过没有安装sqlite3工具的Android设备,因此该命令应始终可用。

此外,由于转储文件只是一个文本文件,因此您应该能够为其提供兼容性所需的任何PRAGMA(如您引用的那个)。

我还没有测试过这个,但只是想和你一起讨论这个有趣的话题。

答案 1 :(得分:1)

sqlite数据库只是一个文件,因此您可以复制该文件,但我认为您可能在android中有权限阻止您访问数据库。

更好的解决方案IMO将您的数据同步到外部网站。 将自定义同步适配器和帐户管理器与具有RESTfull api的网站或Web服务结合使用以接收和发送同步数据将是最可靠的方法。

http://developer.android.com/training/id-auth/identify.html是设置客户经理的绝佳介绍。

对于自定义同步适配器,这是一个很好的起点。 http://www.c99.org/2010/01/23/writing-an-android-sync-provider-part-1/http://www.c99.org/2010/01/23/writing-an-android-sync-provider-part-2/

最后解释它们如何融合在一起 https://sites.google.com/site/andsamples/concept-of-syncadapter-androidcontentabstractthreadedsyncadapter 上述方法可以让用户同时切换电话和保留数据,并且数据始终是最新的(让您在适当的时间同步。

由于您需要设置网络服务似乎需要做很多工作,但这是确保数据安全可靠并且可以随时恢复和备份的最佳方式。

对于网络服务,您可以使用许多选项,包括Google文档等云服务或编写自己的网站。 Ruby on Rails是一个很好的解决方案,用于开发自己的站点,因为你可以获得一个完整的RESTfull api和它;只需要几行代码,就可以轻松地将rails网站安全/锁定到授权用户使用Heroku,您可以免费托管。

与Android开发一样,最简单的要求实际上最难实现,但数据安全性至关重要,那么正确地做到这一点是值得的。

答案 2 :(得分:0)

这个问题太开放了,因为可能适用于db文件内容的更改是开放的,而且无法保证特定的行为。

在积极的一面,sqlite项目是一个开源的,并且指定了DB文件的格式Here

在看了那里之后,解析任何寻找仅数据的数据库文件并将其写入/转储到另一个功能性数据库文件似乎非常可能/不太复杂。

我相信这是解决这个问题的最快,最干净的解决方案。

所以结束:

  • 每次要备份时复制DB文件。
  • 如果要还原,请使用Android API创建新数据库。
  • 从备份文件中解析数据并将其写入新创建的数据库。

P.S: 关于如何使用

  

PRAGMA journal_mode = DELETE

创建数据库时只需使用db.exec("PRAGMA journal_mode = DELETE");