2013-03-19 41 views
2

我试图建立某种形式的备份&在我的应用程序恢复功能。在此之前,我一直在读了一段时间,了解是否有可能实现,但我发现这样一个问题: Sqlite DB Android Backup/Restore有什么办法从SQLite中提取查询吗?

唯一的其他办法,我可以看到这样做,会读DB的和实际内容生成含有它可以从恢复SQL文件,这显然是一个更为复杂和不提供任何优势来证明这种复杂性。

这个答案,我认为是最好的办法;不分解.db文件,但导出查询。

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

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

你们认为这是可能的,我的意思是,有没有内建的方法来实现这一点?

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

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

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

感谢

+0

你看了链接时? – Reinherd 2013-03-19 10:00:22

+0

不想失礼,但我不应该为复杂性辩护。正如用户在我之前链接的问题中所说的,只是复制不是一种备份和恢复的好方法,因为即使它的应用程序和sqlite版本相同,sqlite也可能不会读取数据库。所以我们必须寻找一种解决方法,导出原始查询将是一个不错的尝试。 – Reinherd 2013-03-19 11:53:40

回答

1

我还没有实际使用SQLite尝试过这一点,但使用MySQL,你可以做这样的事情打造“转储”您的数据库。这些转储包含您所描述的内容:一组查询,当它们一起执行时,重新创建数据库,包括内容。

根据在http://www.sqlite.org/sqlite.html(特别是“将整个数据库转换为ASCII文本文件”一节)中的“sqlite3”文档来判断,您可以对sqlite执行相同的操作。既然你可以在Java应用程序中执行shell命令(通过调用Runtime.getRuntime()。EXEC()方法),你是“所有者”的数据库(Linux的用户ID),你应该能够运行这个“sqlite3的。转储“命令,即使在没有根的设备上。我从未见过没有安装sqlite3工具的Android设备,因此该命令应始终可用。

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

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

+0

看起来很酷。我今天会检查一下。如果你有兴趣,将更新你;) – Reinherd 2013-03-19 10:00:58

+0

将此问题标记为“最爱”;-) – baske 2013-03-19 12:16:21

+0

我在尝试执行sqlite3时遇到了一些麻烦。 'Process p = Runtime.getRuntime()。exec(new String [] {“sqlite3”});'抛出一个运行exec()的Exception ExceptionError。命令:[sqlite3]工作目录:null环境:null'。任何想法? – Reinherd 2013-03-19 22:52:09

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服务,但它是确保数据安全和可靠并且可以恢复和备份的最佳方式在任何点

对于Web服务,您可以使用很多选项,包括Google文档等云服务或编写自己的网站。 Ruby on Rails是开发自己的站点的一个很好的解决方案,因为你可以获得一个完整的RESTfull api,并且它很容易仅通过几行代码就可以保护/锁定一个rails站点给授权用户,用Heroku你可以免费托管。

与往常一样,Android开发中最简单的需求实际上最终是最难实现的,但在数据安全至关重要的情况下,值得努力做到这一点。

+0

我不确定这是否是实现此目标的最佳方法。另一个答案看起来“更容易”。还没有尝试过,但我会尽快检查出来。我不认为我们应该建立这个庞大的系统来控制一个简单的数据库应用程序。也许只是提取查询,并生成一个完整性代码应该做的伎俩。 – Reinherd 2013-03-19 11:22:52

+0

@SergiCastellsaguéMillán我同意这是一个复杂的解决方案,但它是安全,灵活和可实现的。你没有说明为什么你需要备份和恢复你的数据,所以我不能提供一个判断,哪一个是最适合你的选择,只是这是推荐的android设计模式。也许这是矫枉过正。只有你可以判断:) – jamesc 2013-03-19 12:35:00

0

由于可能适用于db文件内容的更改是开放的,而且无法保证具体的行为,所以问题太容易回答。

积极的一面源码项目是一个开源的,并且指定Here

考虑看看那里以后的数据库文件的格式,似乎很可能/没有太复杂的分析任何数据库文件寻找Data Only并将其写入/转储到另一个功能性数据库文件。

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

所以包裹起来:你想将其备份

  • 复制数据库文件每次。
  • 当你想恢复使用Android API创建一个新的数据库。
  • 解析备份文件中的数据并将其写入新创建的数据库。

P.S: 关于如何使用

PRAGMA journal_mode =删除

只需使用db.exec("PRAGMA journal_mode = DELETE");创建DB

相关问题