2

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

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

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

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

这就是我试图模仿的;从 .db 文件生成一个包含 sql 查询的文件。

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

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

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

前一段,看不懂 这是您设置为 sqlite 的配置吗?

谢谢

4

3 回答 3

1

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

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

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

我没有测试过这些,只是想和你一起思考这个有趣的话题。

于 2013-03-19T09:30:58.840 回答
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 上述方法将使用户能够同时切换手机并保留数据,并且数据将始终是最新的(如果您在适当的时间同步。

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

对于网络服务,您可以使用许多选项,包括云服务(例如 Google 文档)或编写自己的网站。Ruby on Rails 是开发您自己的网站的绝佳解决方案,因为您可以开箱即用地获得完整的 RESTfull api;只需几行代码,就可以很容易地将 Rails 网站保护/锁定给授权用户,并且使用 Heroku,您可以获得免费托管。

像往常一样,Android 开发中最简单的需求实际上最终是最难实现的,但是在数据安全至高无上的情况下,正确地完成它是值得的。

于 2013-03-19T10:11:38.353 回答
0

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

从好的方面来说,sqlite 项目是一个开源项目,并且指定了 DB 文件的格式Here

在那里看了之后,解析任何寻找Data Only的 DB 文件并将其写入/转储到另一个功能性 db 文件似乎很有可能/不太复杂。

我相信这是解决手头问题的最快和最干净的解决方案。

所以总结一下:

  • 每次要备份时复制数据库文件。
  • 当您想要使用 Android API 恢复创建新数据库时。
  • 从备份文件中解析数据并将它们写入新创建的数据库。

PS:关于如何使用

PRAGMA journal_mode = DELETE

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

于 2013-03-19T12:54:38.830 回答