2014-10-04 41 views
0

我想实现一个服务来备份我的Android应用程序的SQLite数据库。我打算将这项服务安排为频繁备份(例如每天),并添加一个选项以立即启动。备份期间锁定SQLite数据库文件

我的问题是服务可能在应用程序运行时启动,或者用户可能在备份过程中启动应用程序。他们可能在我复制它时写入数据库。

有什么办法可以确保复制和写入不会同时运行,没有为我的所有查询添加同步锁

谢谢!

回答

1

如果你不使用显式事务,SQLite会自动在每个SQL语句周围使用一个事务。

为了确保在备份过程中数据库文件不能被其他数据库连接访问,请在备份周围打开一个exclusive transaction

+0

这就是我需要的;备份API可能是更好的选择,但在我的情况下不容易使用 – personne3000 2014-10-06 09:34:11

1

SQLite网站has some notes对正在运行的数据库执行热备份。请参阅该页面中的Example 2

在android中,如果你想启动你的sqlite数据库文件的文件副本,你首先需要得到如上所述的shared lock,但这种方法有缺点。

理想情况下,您需要使用sqlite3_backup_ * apis。

这些API在标准的android sqlite API中不可用,但it is easy to copy the sqlite jni code to your project,并公开这些附加功能。这种方法的优点是你不必改变代码中的现有API调用,因为它反映了现有的android sqlite API定义。

要公开备份API,请查看android_database_SQLiteConnection.cpp以查看现有的JNI函数如何调用本机sqlite_ * API。

另一种选择是使用某种东西like sqlite4java,它具有sqlite backup APIs wrapped in as Java API,似乎是latest version supports Android

+0

好的信息,谢谢!这绝对看起来像一个SQLite数据库的方式;即使它在Android上有点困难。但事实上,我正在使用SQLCipher数据库,这使得应用这一点变得更加困难。 – personne3000 2014-10-06 09:32:47