我正在尝试实现一项服务来备份我的Android应用程序的SQLite数据库。我计划安排此服务进行频繁备份(例如每天),并添加一个选项以立即启动它。
我的问题是服务可能在应用程序运行时启动,或者用户可能在备份过程中启动应用程序。在我复制数据库时,他们可能会写入数据库。
有没有办法确保复制和写入不会同时运行,没有为我的所有查询添加同步锁?
谢谢!
答案 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。