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

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

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

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

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

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

概覽

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

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

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

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

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

這樣就打開了 Database Inspector:

△ Database Inspector 窗口??

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

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

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

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

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

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

請(qǐng)求數(shù)據(jù)庫

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

當(dāng)我點(diǎn)擊運(yùn)行圖標(biāo)來請(qǐng)求 getPlantsWithGrowZoneNumber() 并且選擇對(duì)應(yīng)的數(shù)據(jù)庫的時(shí)候,會(huì)彈出一個(gè)對(duì)話框讓我們填寫:growZoneNumber?的值。

△ 您可以直接通過 @Query 注解來運(yùn)行請(qǐng)求??

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

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

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

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

Select * from plants where growZoneNumber=9

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

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

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

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

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

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

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

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

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

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

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

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

△ 選擇 Live updates

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

△ Database Inspector 會(huì)自動(dòng)顯示數(shù)據(jù)修改??

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

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

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

快來嘗試新推出的 Database Inspector!歡迎大家和我們分享心得。如果遇到任何問題,請(qǐng)?jiān)谶@里提出:?

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

點(diǎn)擊這里下載最新 Android Studio 4.1 Canary 版本,即刻體驗(yàn) Database Inspector 工具!

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

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