發表文章

目前顯示的是有「SQLite」標籤的文章

Android 9 開始採用之 SQLite WAL 模式

圖片
前言 從 Android 9 開始,App 的 SQLite 日誌模式預設採用 SQLite 在 3.7.0 版加入的 WAL (Write-Ahead Logging) 模式。 相較於原本的 TRUNCATE 模式,有寫入速度較快、讀和寫不會阻塞......等優點。 詳細內容可以參考 SQLite 官方網站,這邊就不詳述了。 Write-Ahead Logging 採用 WAL 前後的檔案結構差異 原先的 databases 目錄下有 *.db 和 *.db-journal 兩個檔案。 採用 WAL 的 databases 目錄下則改為 *.db、*.db-shm、*.db-wal 三個檔案。 交易模型 (Transaction Model) 日誌 (journal) 的主要目的是為了要讓 SQLite 可以支援「交易」(TRANSACTION),當交易失敗或中斷時可用此檔案來還原。 而 SQLite 對於日誌的處理有兩種作法: 回滾日誌檔 (Rollback Journal): 先將原內容則備份至 Rollback Journal 中,再將要異動的內容直接寫入 DB。當需要 rollback 時,再將原內容由日誌檔寫回 DB;若要 commit 變更時,則只要將該檔案刪除即可。 而 rollback 的日誌模式又可細分為 4 種:DELETE (SQLite 預設值)、TRUNCATE (Android 版 SQLite 預設值)、PERSIST、MEMORY WAL (Write-Ahead Log):  作法與 Rollback Journal 剛好相反。原內容仍保留在原 DB 之中,但新的異動則 append 至 WAL 檔。而當 COMMIT 發生時,僅代表某筆記錄已 append 進 WAL 檔了,但並不一定有寫入原 DB (當 WAL 檔案大小到達 checkpoint 的閥值時才會寫入) 。如此可讓其他資料庫連結繼續對原 DB 內容進行讀取操作,而其他連結也可同時將異動 COMMIT 進 WAL 檔。 啟用/停用 WAL 在繼承 SQLiteOpenHelper 的 class 中覆寫 onConfigure 方法,加...

Android 使用 AutoCompleteTextView 搭配 SQLite 取得曾經輸入的資料

圖片
為了讓輸入資料時更方便,試著使用了 AutoCompleteTextView 想讓 App 自動顯示以前輸入過的資料。 首先需要設定 AutoCompleteTextView 的 Adapter,一般的範例都使用 SimpleCursorAdapter。 但是我們可以發現到,它會列出所有該欄位的內容,這樣子使用者先輸入的文字就沒有意義了。 原本想直接在 Cursor 設定 query 的條件,但沒想到竟然無效!不得已只好另尋它法,於是就在 SimpleCursorAdapter 找到了 setFilterQueryProvider。 這邊有兩個重點要注意: 第一是根據 SimpleCursorAdapter 的父類別 CursorAdapter 的設計,資料的欄位(Column)必須包含「_id」這個名字的欄位,所以在 SQL 指令的 SELECT 後必須加入「_id」。 第二個則是使用者體驗的考量,不要讓結果出現重複的內容;這可以在 SQL 指令中使用「GROUP BY」來實現。 下面左圖為沒有 GROUP BY,右圖則有使用 GROUP BY: 到這邊看似已經完成了吧?但其實還有最後一個坑! 點選自動完成的內容後,得到的不是想像中的文字,而是類似物件位址的一長串字! 原因是前面 setFilterQueryProvider 得到的是 Cursor,而我們必須再從中取出需要的資料。 這邊使用的是 setCursorToStringConverter。 做到這一步,終於完成了