我想實現一個服務來備份我的Android應用程序的SQLite數據庫。我打算將這項服務安排爲頻繁備份(例如每天),並添加一個選項以立即啓動。備份期間鎖定SQLite數據庫文件
我的問題是服務可能在應用程序運行時啓動,或者用戶可能在備份過程中啓動應用程序。他們可能在我複製它時寫入數據庫。
有什麼辦法可以確保複製和寫入不會同時運行,沒有爲我的所有查詢添加同步鎖?
謝謝!
我想實現一個服務來備份我的Android應用程序的SQLite數據庫。我打算將這項服務安排爲頻繁備份(例如每天),並添加一個選項以立即啓動。備份期間鎖定SQLite數據庫文件
我的問題是服務可能在應用程序運行時啓動,或者用戶可能在備份過程中啓動應用程序。他們可能在我複製它時寫入數據庫。
有什麼辦法可以確保複製和寫入不會同時運行,沒有爲我的所有查詢添加同步鎖?
謝謝!
如果你不使用顯式事務,SQLite會自動在每個SQL語句周圍使用一個事務。
爲了確保在備份過程中數據庫文件不能被其他數據庫連接訪問,請在備份周圍打開一個exclusive transaction。
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。
好的信息,謝謝!這絕對看起來像一個SQLite數據庫的方式;即使它在Android上有點困難。但事實上,我正在使用SQLCipher數據庫,這使得應用這一點變得更加困難。 – personne3000 2014-10-06 09:32:47
這就是我需要的;備份API可能是更好的選擇,但在我的情況下不容易使用 – personne3000 2014-10-06 09:34:11