我正在尝试创建某种备份&恢复我的应用程序中的功能在此之前,我已经阅读了一段时间才能理解是否可以实现,但我发现了这个问题: Sqlite DB Android Backup/Restore
我能看到的另一种方法是读取数据库的实际内容并生成一个包含SQL的文件,它可以从中恢复,这显然更复杂,不提供任何有利于证明这种复杂性的好处。
我认为,这个答案是实现这一目标的最佳方式;不是在探索.db文件,而是导出查询。
你知道;当您从mysql导出SQL数据时,您将获得一个文件,其中包含创建结构的所有查询以及使用数据填充结构的查询。
这就是我想要模仿的东西;生成一个包含来自.db文件的SQL查询的文件。
你们认为有可能,我的意思是,是否有任何内置方法可以实现这一目标?
否则,如果它太难处理,你如何设法避免这个用户(https://stackoverflow.com/a/10842043/1943607)在谈论什么?
所以,我用“PRAGMA journal_mode = DELETE”禁用了WAL,然后我就能在浏览器中查看数据库并能够在我的测试设备上恢复它。
前一部分,我无法理解。这是你设置为sqlite的配置吗?
由于
答案 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
在看了那里之后,解析任何寻找仅数据的数据库文件并将其写入/转储到另一个功能性数据库文件似乎非常可能/不太复杂。
我相信这是解决这个问题的最快,最干净的解决方案。
所以结束:
P.S: 关于如何使用
PRAGMA journal_mode = DELETE
创建数据库时只需使用db.exec("PRAGMA journal_mode = DELETE");