在备份期间锁定SQLite数据库文件

时间:2014-10-04 17:26:39

标签: android sqlite synchronization backup android-sqlite

我正在尝试实现一项服务来备份我的Android应用程序的SQLite数据库。我计划安排此服务进行频繁备份(例如每天),并添加一个选项以立即启动它。

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

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

谢谢!

2 个答案:

答案 0 :(得分:1)

如果您没有使用显式事务,SQLite将自动在每个SQL语句周围使用事务。

要确保在执行备份时其他数据库连接无法访问数据库文件,请在备份周围打开exclusive transaction

答案 1 :(得分:1)

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

在android中,如果要启动sqlite db文件的文件副本,首先需要获得上面提到的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