使用greenDao操作本地數據庫,Android9.0讀取數據庫失敗的問題解決辦法

首先看下這篇文章 應用程序的兼容性WAL(預寫日誌記錄) 關於Android Sqlite數據庫的一個介紹

Android 9引入一種 名爲Compatibility WAL(預寫日誌記錄)的 SQLite數據庫的特殊模式,它允許數據庫使用journal_mode=WAL,同時保留每個數據庫最多保持一個連接的行爲。

應用程序的數據庫默認啓用兼容性WAL,除非應用程序具有:

  1. 通過調用SQLiteDatabase.enableWriteAheadLoggingdisableWriteAheadLogging選擇加入或禁止預寫日誌記錄
  2. 通過調用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!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章