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