使用 databaseBuilder 與 Main thread問題,確定 Room 真的寫到 SQLite

作者 | 2017-12-27

本文接續上一篇Room 可以完全取代 SQLiteOpenHelper 存取 SQLite 好物

上一篇提到我們寫了 Test Case,檢查 Database、DAO、Entity 皆正確無誤,但畢竟只是測試案例,如何確定真的寫入 SQLite呢?接著,我們就來試試看。

Create Database

Room 產生資料庫有兩個方法

  • databaseBuilder
  • inMemoryDatabaseBuilder

在上一篇的測試案例中,我們使用的方法為 inMemoryDatabaseBuilder,現在我們要在手機上實際產生資料庫,所以採用 databaseBuilder 方法。

DB Connection

由於資料庫連線只要一個就夠,官方建議使用 Singleton 方式取得資料庫連線,此處改寫 ExpenseDatabase,使之成為Singleton。

Insert Expense

接著只要在主程式中加入這兩行,應該就會寫入一筆資料了。

可是…..

Cannot access database on the main thread

原來, Main thread 不可執行耗時工作,即使換成了 Room 也是一樣。有兩個方法可以解決,一是在取得資料庫連線時增加 allowMainThreadQueries() 方法,強制在主程式中執行,如下:

一是另開 thread 執行耗時工作 (建議採用此方法),另開 thread 有多種寫法,按自己習慣作業即可。此處為測試是否寫入手機SQLite,故不考慮 callback,如下:

如此一來,APP 即可正常作業。

Check SQLite

接著要檢查手機/模擬器 Database、Table 是否自動產生且寫入一筆資料,此處使用 ADB 查看 SQLite,ADB 用法請參考 ADB登入模擬器

如此一來即可確定資料確實寫入 SQLite 了

相關文章:

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *