首先看下這篇文章 應用程序的兼容性WAL(預寫日誌記錄) 關於Android Sqlite數據庫的一個介紹
Android 9引入一種 名爲Compatibility WAL(預寫日誌記錄)的 SQLite數據庫的特殊模式,它允許數據庫使用
journal_mode=WAL
,同時保留每個數據庫最多保持一個連接的行爲。應用程序的數據庫默認啓用兼容性WAL,除非應用程序具有:
- 通過調用SQLiteDatabase.enableWriteAheadLogging 或disableWriteAheadLogging選擇加入或禁止預寫日誌記錄
- 通過調用
SQLiteDatabase.OpenParams.setJournalMode(String mode)
顯式請求日誌模式作者:ben3726
鏈接:https://www.jianshu.com/p/9cbe3839a1e2
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
下圖是Android9.0拷貝本地數據庫到App中後的databases目錄:
下圖是Android其他版本的目錄:
所以,問題在於拷貝數據庫之後app讀取了-wal文件中的不全的數據記錄,導致讀取失敗或者崩潰,
在網上查詢解決辦法之後,都是說禁用WAL模式,
由於項目中使用了greenDao三方庫,這裏就寫出greenDao的解決方式,用Android原生的數據庫的解決方式應該差不多。
private void initGreenDao() {
mHelper = new DaoMaster.DevOpenHelper(this, DB_NAME);
db = mHelper.getWritableDatabase();
//在初始化greenDao的地方加上這一行
db.disableWriteAheadLogging();
mDaoMaster = new DaoMaster(db);
mDaoSession = mDaoMaster.newSession();
}
編譯安裝App後導入數據庫後的databases的目錄如下
可以看到已經禁用了wal模式,.wal文件也不存在了,打開app也沒有任何問題了。
最後貼下怎麼打開Android Studio的Device File Explorer工具查看調試的模擬器和真機的app目錄文件
在Android Studio3.5版本中依次打開頂部導航欄的View --> Tool Windows -- > Device File Explorer
Over!