新版Glance發(fā)布,更好用的Android數(shù)據(jù)庫調(diào)試助手
本文轉(zhuǎn)載自微信公眾號(hào)「郭霖」,作者郭霖。轉(zhuǎn)載本文請(qǐng)聯(lián)系郭霖公眾號(hào)。
Glance是一個(gè)由我開發(fā)的用于調(diào)試Android數(shù)據(jù)庫的開源庫,無須借助電腦和數(shù)據(jù)線,直接在手機(jī)上就可以查看當(dāng)前App中數(shù)據(jù)庫的內(nèi)容。
Glance的1.0版本于去年12月份推出,具體功能可以參考這篇文章 我又開發(fā)了一個(gè)非常好用的開源庫 。
然而自從首個(gè)版本推出之后,Glance就再也沒有更新過。主要還是因?yàn)槲覍?shí)在是太忙了,平時(shí)只能用零散的業(yè)余時(shí)間寫寫博客,還有3個(gè)開源項(xiàng)目要同時(shí)維護(hù),能分配到Glance上的時(shí)間實(shí)在有限。
然而就這樣零零散散地寫了8個(gè)多月的代碼,Glance確實(shí)變得比之前更加優(yōu)秀了。雖然增加的一些新功能看上去并不是很重要,但累積多了之后,我認(rèn)為這已經(jīng)足以發(fā)布一個(gè)全新的版本了。
那么Glance 1.1.0版本今天正式發(fā)布,就讓我來帶著大家看看新版的Glance到底多了哪些新功能吧。
/ 支持顯示Room數(shù)據(jù)庫 /
之前有不少朋友在使用Glance的時(shí)候向我反饋,說有些數(shù)據(jù)庫Glance是顯示不出來的,包括使用Room創(chuàng)建的數(shù)據(jù)庫。
之所以會(huì)出現(xiàn)這樣的情況,是因?yàn)镚lance在搜索數(shù)據(jù)庫文件時(shí)只是簡單地以.db后綴名來作為判斷條件。這種方式優(yōu)點(diǎn)是效率非常高,但缺點(diǎn)也很明顯,搜索的結(jié)果不準(zhǔn)。因?yàn)橛行?shù)據(jù)庫文件并不是以.db為后綴的,比如說Room創(chuàng)建的數(shù)據(jù)庫默認(rèn)都是無后綴的。
因此,在新版的Glance當(dāng)中,我將搜索規(guī)則進(jìn)行了修改,不再是簡單地以后綴名來進(jìn)行判斷,而是真正地去判斷該文件是不是一個(gè)數(shù)據(jù)庫文件。
Android上的數(shù)據(jù)庫文件如果以二進(jìn)制的方式去讀取它,它的頭部一定是以"SQLite format 3"開始的,所以通過以下代碼就能夠準(zhǔn)確地判斷出一個(gè)文件是不是數(shù)據(jù)庫文件:
- /**
- * Check this file is valid SQLite db file or not.
- */
- fun File.isValidDBFile() = try {
- val reader = FileReader(this)
- val buffer = CharArray(16)
- reader.read(buffer, 0, 16)
- val str = String(buffer)
- reader.close()
- str == "SQLite format 3\u0000"
- } catch (e: Exception) {
- e.printStackTrace()
- false
- }
雖然對(duì)所有文件都執(zhí)行這樣的判斷必然會(huì)影響一定的搜索效率,但是Glance還同時(shí)擁有對(duì)數(shù)據(jù)庫文件的緩存機(jī)制,之前搜索過的結(jié)果會(huì)迅速展示出來,因此在這方面能彌補(bǔ)一些效率的問題。
/ 允許橫向縱向同時(shí)滾動(dòng) /
Glance查看數(shù)據(jù)庫表內(nèi)容的界面做得還算是比較精美的,如下圖所示:
這個(gè)界面是使用橫向ScrollView加縱向RecyclerView的方式來實(shí)現(xiàn)的,所以支持在橫向和縱向兩個(gè)方向上滑動(dòng)。
但是同一時(shí)刻,我們只能進(jìn)行橫向滑動(dòng)或縱向滑動(dòng),不支持在橫向和縱向上同時(shí)滑動(dòng)。
這里我要特別感謝ultimateHandsomeBoy666這位網(wǎng)友,他向Glance提交了一個(gè)Pull request,使得我們可以在橫向和縱向上同時(shí)滑動(dòng)來查看數(shù)據(jù)。
至于實(shí)現(xiàn)的原理也很簡單:
- /**
- * deal with the motion event to scroll, while passing the event downwards
- */
- override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
- onTouchEvent(ev)
- return super.dispatchTouchEvent(ev)
- }
- /**
- * do not intercept touch event so that child scrollable view can also receive event to scroll
- */
- override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean = false
就是在外層的橫向ScrollView當(dāng)中,我們不使用默認(rèn)的onInterceptTouchEvent攔截機(jī)制,而是讓它不要攔截。
然后在dispatchTouchEvent的時(shí)候,我們除了自己處理這個(gè)Touch事件之外,同時(shí)也將事件分發(fā)出去,這樣RecyclerView就可以一起處理這個(gè)事件了。
最終的效果如下圖所示:
/ 支持多應(yīng)用入口區(qū)分 /
Glance的入口是會(huì)在手機(jī)桌面創(chuàng)建一個(gè)Glance的圖標(biāo),點(diǎn)擊該圖標(biāo)即可查看你的應(yīng)用中包含的數(shù)據(jù)庫文件。
然而,我沒想到的一個(gè)問題是,假如一個(gè)手機(jī)上安裝了很多個(gè)應(yīng)用,而這些應(yīng)用都引入了Glance庫,那么會(huì)導(dǎo)致你完全分不清楚每個(gè)Glance圖標(biāo)到底對(duì)應(yīng)的是哪個(gè)應(yīng)用。
這個(gè)問題也是由一位熱心網(wǎng)友提出我才意識(shí)到的:
可以看到,桌面上一堆Glance圖標(biāo),已經(jīng)完全不知道哪個(gè)是哪個(gè)了。
剛看到這個(gè)Bug時(shí),我還沒想好要怎么修,因?yàn)槟莻€(gè)時(shí)候正在忙著寫另外一個(gè)功能。沒想到幾天之后發(fā)現(xiàn)ultimateHandsomeBoy666這位網(wǎng)友又提了一個(gè)Pull request,將這個(gè)問題給修復(fù)了。
ultimateHandsomeBoy666采取的方案是,桌面Glance的入口圖標(biāo)不再命名成Glance,而是命名成和主App一樣的名字,但是圖標(biāo)仍然保持Glance的樣式,以和主App做區(qū)分。這樣即使有再多的App引用Glance,也不會(huì)造成混亂了。
我認(rèn)為這種修改方式非常恰當(dāng),再次感謝ultimateHandsomeBoy666這位朋友的幫助。
/ 允許修改數(shù)據(jù)庫內(nèi)容 /
好吧,我這8個(gè)月的主要工作應(yīng)該都在這個(gè)功能上了。
之前Glance的主要功能是幫助你查找出當(dāng)前應(yīng)用中所包含的所有數(shù)據(jù)庫,并將它們的內(nèi)容展示出來。
也就是說,你只能看一看里面的數(shù)據(jù)而已。但如果想要對(duì)其中的數(shù)據(jù)進(jìn)行修改,這是不可以的。
而修改數(shù)據(jù)是一個(gè)非常有用的功能,也是長期以來不少朋友的呼聲。因此Glance 1.1.0版本最重磅的一個(gè)功能就是,允許開發(fā)者直接在手機(jī)中對(duì)當(dāng)前應(yīng)用的數(shù)據(jù)庫數(shù)據(jù)進(jìn)行修改。
至于修改數(shù)據(jù)的方式也非常簡單,直接在你想要修改的那條數(shù)據(jù)上雙擊即可,如下圖所示:
這種便捷的可視化界面修改數(shù)據(jù)的方式相信許多開發(fā)者朋友都是非常需要的,你完全不需要借助電腦,全部在手機(jī)上就可以完成。
另外我想說的是,Glance展示數(shù)據(jù)庫內(nèi)容的功能是使用Paging 3實(shí)現(xiàn)的。之前我在寫講解Paging 3用法文章的時(shí)候,有不少朋友問我在Paging 3中要如何才能修改數(shù)據(jù),聽上去像是一個(gè)非常難以完成的事情。由于我當(dāng)時(shí)確實(shí)沒有嘗試過修改數(shù)據(jù)這個(gè)功能,所以也回答不上來這些朋友的問題。
但是這次在Glance中實(shí)現(xiàn)修改數(shù)據(jù)功能之后,我發(fā)現(xiàn)Paging 3在修改數(shù)據(jù)上并沒有什么無法實(shí)現(xiàn)或難理解的地方,和正常使用RecyclerView時(shí)修改數(shù)據(jù)的方法幾乎是差不多的。因此以后如果還有朋友在使用Paging 3時(shí)有修改數(shù)據(jù)的疑問,不妨可以參考下Glance的源碼實(shí)現(xiàn)。
最后,使用Glance來修改數(shù)據(jù)還有一個(gè)限制,就是表中一定要有主鍵,否則是無法修改的。因?yàn)橹麈I是對(duì)一行數(shù)據(jù)的唯一約束,如果沒有主鍵的話,Glance是無法知道用戶想要修改哪一行數(shù)據(jù)的。
/ 如何升級(jí) /
關(guān)于Glance新版本的內(nèi)容變化就介紹到這里,升級(jí)的方式非常簡單,修改一下dependencies當(dāng)中的版本號(hào)即可:
- repositories {
- google()
- mavenCentral()
- }
- dependencies {
- debugImplementation 'com.guolindev.glance:glance:1.1.0'
- }
注意現(xiàn)在一定要使用mavenCentral倉庫,而不能再使用jcenter了。至于原因,可以參考我的這篇文章 淺談JCenter即將被停止服務(wù)的事件 。
如果你對(duì)Glance的源碼感興趣,可以訪問Glance的項(xiàng)目主頁:
https://github.com/guolindev/Glance