在上一篇文章當中,我們已經把LitePal查詢操作的所有用法都學習完了,很顯然,LitePal幫我們提供了非常強大的查詢API,使得我們可以極度輕鬆地完成各種型別的查詢。但是呢,在SQL語句當中,有一種查詢是比較特殊的,就是聚合函式查詢,它不像傳統查詢一樣是將表中的某些列的資料查詢出來,而是將查詢結果進行聚合和統計,最終將統計後的結果進行返回。因此,任何一個關係型資料庫中都會提供像count()、sum()等聚合函式。那麼不出你所料,LitePal當中也是對這些聚合函式都進行了封裝,讓我們的操作可以變得更加簡單。因此,今天我們就來學習一下LitePal中聚合函式的用法,還沒有看過前面一篇文章的朋友建議先去參考 Android資料庫高手祕籍(7):體驗LitePal的查詢藝術 。
LitePal的專案地址是:https://github.com/LitePalFramework/LitePal
傳統的聚合函式用法
雖說是聚合函式,但它的用法其實和傳統的查詢還是差不多的,即仍然使用的是select語句。但是在select語句當中我們通常不會再去指定列名,而是將需要統計的列名傳入到聚合函式當中,那麼執行select語句使用的還是SQLiteDatabase中的rawQuery()方法。下面我們來嘗試一下,比如說想要統計news表中一共有多少行,就可以這樣寫:
1 2 3 4 5 6 7 |
SQLiteDatabase db = dbHelper.getWritableDatabase(); Cursor c = db.rawQuery("select count(1) from news", null); if (c != null && c.moveToFirst()) { int count = c.getInt(0); Log.d("TAG", "result is " + count); } c.close(); |
可以看到,在rawQuery()方法中我們指定了一個聚合查詢語句,其中count(1)就是用於去統計一共有多少行的。當然這裡並不一定要用count(1),使用count(*)或者count(主鍵)都可以。然後rawQuery()方法返回的是一個Cursor物件,我們從這個Cursor當中取出第一行第一列的資料,這也就是統計出的結果了。
那如果我們想要統計出news表中評論的總數量該怎麼寫呢?程式碼如下所示:
1 2 3 4 5 6 7 |
SQLiteDatabase db = dbHelper.getWritableDatabase(); Cursor c = db.rawQuery("select sum(commentcount) from news", null); if (c != null && c.moveToFirst()) { int count = c.getInt(0); Log.d("TAG", "result is " + count); } c.close(); |
我們發現,程式碼基本是非常相似的,只不過查詢語句當中count()函式替換成了sum()函式。當然了,sum()函式要求傳入一個指定的列名,表示我們要彙總這一列的總合,因此這裡我們傳入了commentcount這一列。
其它聚合函式的用法也是類似的,就不一一列舉了。由此我們可以總結出一些結論,聚合函式都是要使用rawQuery()方法進行SQL查詢,然後結果會封裝到Cursor物件當中,接著我們再從Cursor中將結果取出。雖說你可能覺得上面的用法已經足夠簡單了,因為總共也就只寫了六七行程式碼,但是你有沒有想過更簡單的寫法,比如說只用一行程式碼就完成聚合查詢操作。你沒有看錯,就是一行程式碼,LitePal讓這些都成為了可能,那麼下面我們就來學習一下LitePal中聚合函式的用法。
使用LitePal的聚合函式
LitePal中一共提供了count()、sum()、average()、max()和min()這五種聚合函式,基本上已經將SQL語句當中最常用的幾種聚合函式都覆蓋了,那麼下面我們就來對這五種聚合函式的用法一一進行學習。
count()
count()方法主要是用於統計行數的,剛才演示瞭如何通過SQL語句來統計news表中一共有多少行,那麼下面我們來看一下如何通過LitePal來實現同樣的功能,程式碼如下所示:
1 |
int result = DataSupport.count(News.class); |
你沒有看錯!就是這樣一行程式碼就可以了。呼叫DataSupport類當中的count()方法,count()方法接收一個Class引數,用於指定去統計哪張表當中的資料,然後返回值是一個整型資料,也就是統計出的結果了。
除此之外,LitePal中所有的聚合函式都是支援連綴的,也就是說我們可以在統計的時候加入條件語句。比如說想要統計一共有多少條新聞是零評論的,就可以這樣寫:
1 |
int result = DataSupport.where("commentcount = ?", "0").count(News.class); |
這個用法和我們在上一篇文章當中學到的連綴查詢是比較像的,在DataSupport類中首先指定一個where語句用於條件約束,然後連綴一個count()方法,這樣統計出的就是滿足條件語句的結果了。連綴不僅適用於count()方法,也同樣適用於下面我們將要介紹的所有方法,但由於用法都是相同的,後面就不再重複介紹了。
sum()
看完了count()方法應該是覺得非常簡單吧,剩下的幾個聚合函式也是同樣簡單的,我們繼續來學習一下。
sum()方法主要是用於對結果進行求合的,比如說我們想要統計news表中評論的總數量,就可以這樣寫:
1 |
int result = DataSupport.sum(News.class, "commentcount", int.class); |
sum()方法的引數要稍微多一點,我們來一一看下。第一個引數很簡單,還是傳入的Class,用於指定去統計哪張表當中的資料。第二個引數是列名,表示我們希望對哪一個列中的資料進行求合。第三個引數用於指定結果的型別,這裡我們指定成int型,因此返回結果也是int型。
需要注意的是,sum()方法只能對具有運算能力的列進行求合,比如說整型列或者浮點型列,如果你傳入一個字串型別的列去求合,肯定是得不到任何結果的,這時只會返回一個0作為結果。
average()
average()方法主要是用於統計平均數的,比如說我們想要統計news表中平均每條新聞有多少評論,就可以這樣寫:
1 |
double result = DataSupport.average(News.class, "commentcount"); |
其中average()方法接收兩個引數,第一個引數不用說,仍然是Class。第二個引數用於指定列名的,表示我們想要統計哪一列的平均數。需要注意的是,這裡返回值的型別是double型,因為平均數基本上都是會帶有小數的,用double型別可以最大程式保留小數位的精度。
同樣地,average()方法也只能對具有運算能力的列進行求平均值,如果你傳入了一個字串型別的列,也是無法得到任何結果的,這時同樣只會返回一個0作為結果。
max()
max()方法主要用於求出某個列中最大的數值,比如我們想要知道news表中所有新聞裡面最高的評論數是多少,就可以這樣寫:
1 |
int result = DataSupport.max(News.class, "commentcount", int.class); |
可以看到,max()方法接收三個引數,第一個引數同樣還是Class,用於指定去統計哪張表當中的資料。第二個引數是列名,表示我們希望統計哪個列中的最大值。第三個引數用於指定結果的型別,根據實際情況來選擇傳入哪種型別就行了。
那麼不用多說,max()方法也只能對具有運算能力的列進行求最大值的,希望你在使用的時候能夠謹記這一點。
min()
min()方法主要用於求出某個列中最小的數值,比如我們想要知道news表中所有新聞裡面最少的評論數是多少,就可以這樣寫:
1 |
int result = DataSupport.min(News.class, "commentcount", int.class); |
min()方法和max()方法的用法基本上是一模一樣的,引數也是完全相同,只是方法名變了一下。它們一個是求出某一列中的最大值,一個是求出某一列中的最小值,僅此而已。
現在我們已經將LitePal中所有聚合函式的用法全部都學習完了,怎麼樣,是不是感覺非常的簡單?學完之後相信大家也意識到我在開篇的時候並不是在吹牛皮了,確確實實只需要一行程式碼就可以完成各種聚合查詢操作了,上面任何一個統計操作我們都沒有寫到第二行程式碼。
好了,經過八篇文章的學習,我們已經將LitePal中最主要的功能基本都學習完了,相信你從頭看到這裡,也是經歷了一個對LitePal零認識,到目前可以熟練使用LitePal的一個過程。那麼我們的這個Android資料庫高手祕籍教程到這裡也就要暫停了,這個系列短期不會再更新,而是等到LitePal釋出了新版本,有了新功能之後才會對它繼續進行講解。後面我仍然會繼續分享更多Android技術相關的其它文章,感謝大家對本專欄的持續關注。