期待已久的動態(tài)數(shù)據(jù)庫工具終于來了!

本地數(shù)據(jù)庫的創(chuàng)建和管理是大多數(shù)移動應(yīng)用工程中的核心組件之一,一般會通過直接使用?SQLite?或?Jetpack Room 持久化庫來完成。開發(fā)者們也在不斷地尋求著更好的方式,使其能夠在運行中的應(yīng)用中直接檢查和調(diào)試數(shù)據(jù)庫。

最新的 Android Studio 4.1 (目前處于 Canary 版本) 內(nèi)置了叫作Database Inspector?(數(shù)據(jù)庫檢查器) 的工具,它可以幫助開發(fā)者在已運行的應(yīng)用中檢查、請求以及修改數(shù)據(jù)庫。

△ Database Inspector 可用于修改數(shù)據(jù), 就像修改電子表格一樣 ??

有了 Database Inspector,修改數(shù)據(jù)庫就和編輯電子表格一樣簡單。如果您使用?Jetpack Room?并觀察請求結(jié)果,對數(shù)據(jù)庫的修改會直接體現(xiàn)在應(yīng)用里。

本文中,我們將會在 Sunflower 應(yīng)用中使用 Database Inspector 來測試一些邊界值用例。Sunflower 是一款園藝類應(yīng)用,它向開發(fā)者展示了基于 Android Jetpack 進行應(yīng)用開發(fā)的最佳實踐。所以強烈推薦大家克隆這個代碼倉庫,并且按照本文的操作嘗試一下。

概覽

Sunflower 應(yīng)用的 UI 包含兩個標簽頁。先看一下植物目錄標簽頁,里面列出了可以添加到我的花園的植物。在右上角有一個篩選按鈕,點擊該按鈕會按生長區(qū)篩選植物,出現(xiàn)如下列表:

△ 點擊該按鈕來按照植物生長區(qū)篩選植物??

可以很直觀地看到,這個按鈕會根據(jù)一些條件來篩選植物。假設(shè)我們對整個工程完全不了解,希望通過 Database Inspector 來搞清楚如何實現(xiàn)篩選功能。

從菜單欄依次選擇?View > Tool Windows > Database Inspector,就能在 Android Studio 里打開 Database Inspector。初次打開工程的時候,需要靜待工程編譯完成后即可出現(xiàn)?Database Inspector?的選項。

△ 在菜單欄中依次選擇 View > Tool Windows > Database Inspector 來打開 Database Inspector??

這樣就打開了 Database Inspector:

△ Database Inspector 窗口??

運行 Database Inspector 需要在 API Level 26 或者更高的設(shè)備上運行應(yīng)用,在下拉菜單里選擇該應(yīng)用的進程:

△ 在下拉菜單中選擇運行中的應(yīng)用進程??

選擇所要檢查的應(yīng)用進程之后,數(shù)據(jù)庫的架構(gòu)就會出現(xiàn)在下面的面板上。如果要查看 Sunflower 數(shù)據(jù)庫表,需要找到?Databases?并展開sunflower-db:

△ 一旦選擇了進程,應(yīng)用相關(guān)的數(shù)據(jù)庫就會列出來??

回到應(yīng)用,我們看一下經(jīng)過篩選的植物列表:?這個列表里有 Avocado (鱷梨)、Grape (葡萄)、Orange (橙子) 和 Tomato (番茄)。如果我按照植物名稱進行排序,那么要找 Avocado 的話就會很方便。所以我們可以看看 Database Inspector 可不可以做到這點。

首先,雙擊 Database Inspector 里的 plants 表來顯示表里的數(shù)據(jù)。數(shù)據(jù)是以默認每頁 50 條記錄來顯示,不過如果數(shù)據(jù)總數(shù)更短,那么每頁的結(jié)果數(shù)量和頁數(shù)也會發(fā)生變化。點擊名稱列可以讓植物表按照名稱進行排序。正如我們所想,Avocado 已經(jīng)排在列表的前面了,它就在數(shù)據(jù)表的第二行。

請求數(shù)據(jù)庫

看一下 Avocado 的數(shù)據(jù)輸入,在應(yīng)用中可以使用 growZoneNumber 進行篩選。要驗證這一點,我們運行一個請求,將 growZoneNumber 設(shè)置為 9,對應(yīng)結(jié)果應(yīng)該是 Avocado。實際上,這個請求已經(jīng)在 PlantDao.kt 出現(xiàn)了,我們可以直接通過 Room 的?@Query?注解來調(diào)用這個請求。每個?@Query?注解的代碼行數(shù)旁邊都有一個運行小圖標。

當我點擊運行圖標來請求 getPlantsWithGrowZoneNumber() 并且選擇對應(yīng)的數(shù)據(jù)庫的時候,會彈出一個對話框讓我們填寫:growZoneNumber?的值。

△ 您可以直接通過 @Query 注解來運行請求??

這里我們輸入 9 然后點擊?Run?來查看請求結(jié)果。

除此之外,我們也可以在工具窗口里輸入我們自己的請求并運行。這樣能夠提供更大的自由度,也不會受限于 Dao 接口里的請求語句定義。要運行我們自己的查詢語句,點擊?Run Query?并且從右側(cè)新打開的標簽頁選擇 plants 數(shù)據(jù)庫。

△ 點擊 Run Query 并且選擇應(yīng)用數(shù)據(jù)庫??

然后,在數(shù)據(jù)庫下拉菜單旁邊的文本框里輸入下面這句查詢語句,并點擊?Run。

Select * from plants where growZoneNumber=9

△ 您可以在 Database Inspector 里執(zhí)行 SQL 請求??

大家可以看到,這里請求的篩選結(jié)果和應(yīng)用里開啟篩選器的時候是一樣的。

修改以及調(diào)試數(shù)據(jù)庫

Database Inspector 使得調(diào)試應(yīng)用變得輕而易舉,它還可以讓開發(fā)者直接修改設(shè)備上已運行應(yīng)用的數(shù)據(jù)庫值。

首先,我想在應(yīng)用 UI 上測試一下較長的植物名稱。我們打算使用 Database Inspector 直接修改數(shù)據(jù)庫里的值,而不是通過修改數(shù)據(jù)源再刷新數(shù)據(jù)來進行測試。

△ 您可以在 Database Inspector 里編輯數(shù)據(jù)庫??

現(xiàn)在這里的數(shù)據(jù)元素已經(jīng)可以編輯,我將這里的 Apple 改為 A really special type of Apple,然后點確認。如果您也在同步進行操作,您可以輸入一些期望長度的名稱數(shù)據(jù)在 UI 中進行測試。

△ 如果您的應(yīng)用使用 Jetpack Room 并且監(jiān)聽請求結(jié)果,那么您無需重啟應(yīng)用就能看到數(shù)據(jù)的變化??

回到應(yīng)用會發(fā)現(xiàn)我們什么操作都沒做,應(yīng)用就已經(jīng)顯示了最新的數(shù)據(jù)。如果您的應(yīng)用使用 Jetpack Room,并且監(jiān)聽著請求結(jié)果 (使用 LiveData/Flow),您就沒必要發(fā)起數(shù)據(jù)庫請求來刷新數(shù)據(jù)。否則,根據(jù)您應(yīng)用觸發(fā)請求的方式,可能需要重啟應(yīng)用或者重新打開相關(guān)的 activity 或者 fragment 才可以。這也算是遷移到?LiveData 或者 Flow?的一個不錯的理由,這樣也能發(fā)揮 Database Inspector 的全部潛能。

再來看看應(yīng)用,可以發(fā)現(xiàn)這里的 CardView 并沒有很好地顯示較長的植物名稱。我會在未來修復這個問題,接下來我們先來看看下面的測試。

?△ 應(yīng)用并沒有很好地處理較長的名字??

每個植物都有不同的澆水間隔,我想試試看如果錯過了澆水的日子會發(fā)生什么。要實現(xiàn)這個目的,我們需要在花園里添加一些植物,但是首先,這里我們先在 Database Inspector 里勾選?Live updates?(實時刷新)。當啟用?Live updates?之后,Database Inspector 會自動顯示應(yīng)用里對數(shù)據(jù)庫所做的修改。

△ 選擇 Live updates

然后回到我的花園標簽頁,添加一些植物,比如 Avocado 和 Eggplant,但是首先,回到 Database Inspector,然后雙擊garden_plantings?來觀察數(shù)據(jù)表。請注意觀察圖片,當添加新植物的時候,garden_plantings?表會有哪些變化。

△ Database Inspector 會自動顯示數(shù)據(jù)修改??

這些植物的澆水周期都是三天。當然我不會等待三天來測試這個功能,這里我們直接編輯數(shù)據(jù)庫,然后修改last_watering_day?的值。我們再回到 Database Inspector,雙擊進入?garden_plantings?數(shù)據(jù)表,last_watering_day?位于數(shù)據(jù)庫的最后一列。我會把兩個記錄的last_watering_day?值修改為目前日期稍早一些時候。

△ 對數(shù)據(jù)庫的修改會直接展示出來??

好吧,看上去好像調(diào)整的日期有點太靠前了,不過應(yīng)該也能達到測試的目的。應(yīng)用的 UI 似乎正常顯示了所需澆水的日期。在下一步開發(fā)中,我們也許可以增加一個提醒功能,當已經(jīng)超出澆水日期的時候,可以向用戶發(fā)出提醒。

快來嘗試新推出的 Database Inspector!歡迎大家和我們分享心得。如果遇到任何問題,請在這里提出:?

https://issuetracker.google.com/issues/new?component=192708&template=840533&title=%23database-inspector

點擊這里下載最新 Android Studio 4.1 Canary 版本,即刻體驗 Database Inspector 工具!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容