Android數據庫高手祕籍(八)——使用LitePal的聚合函數

前言

在上一篇文章當中,咱們已經把 LitePal 查詢操做的全部用法都學習完了,很顯然,LitePal 幫咱們提供了很是強大的查詢 API,使得咱們能夠極度輕鬆地完成各類類型的查詢。可是呢,在 SQL 語句當中,有一種查詢是比較特殊的,就是聚合函數查詢,它不像傳統查詢同樣是將表中的某些列的數據查詢出來,而是將查詢結果進行聚合和統計,最終將統計後的結果進行返回。所以,任何一個關係型數據庫中都會提供像 count()、sum() 等聚合函數。git

那麼不出你所料,LitePal 當中也是對這些聚合函數都進行了封裝,讓咱們的操做能夠變得更加簡單。所以,今天咱們就來學習一下 LitePal 中聚合函數的用法,尚未看過前面一篇文章的朋友建議先去參考 Android 數據庫高手祕籍 (七)——體驗 LitePal 的查詢藝術github

LitePal 的項目地址是:github.com/LitePalFram…數據庫

傳統的聚合函數用法

雖然說是聚合函數,但它的用法其實和傳統的查詢仍是差很少的,即仍然使用的是 select 語句。可是在 select 語句當中咱們一般不會再去指定列名,而是將須要統計的列名傳入到聚合函數當中,那麼執行 select 語句使用的仍是 SQLiteDatabase 中的 rawQuery() 方法。下面咱們來嘗試一下,好比說想要統計 news 表中一共有多少行,就能夠這樣寫:markdown

SQLiteDatabase db = dbHelper.getWritableDatabase();

Cursor c = db.rawQuery("select count(1) from news", null);

if (c != null && c.moveToFirst()) {

	Log.d("TAG", "result is " + count);
複製代碼

能夠看到,在 rawQuery() 方法中咱們指定了一個聚合查詢語句,其中 count(1) 就是用於去統計一共有多少行的。固然這裏並不必定要用 count(1),使用 count(*) 或者 count(主鍵) 均可以。而後 rawQuery() 方法返回的是一個 Cursor 對象,咱們從這個 Cursor 當中取出第一行第一列的數據,這也就是統計出的結果了。app

那若是咱們想要統計出 news 表中評論的總數量該怎麼寫呢?代碼以下所示:ide

SQLiteDatabase db = dbHelper.getWritableDatabase();

Cursor c = db.rawQuery("select sum(commentcount) from news", null);

if (c != null && c.moveToFirst()) {

	Log.d("TAG", "result is " + count);
複製代碼

咱們發現,代碼基本是很是類似的,只不過查詢語句當中 count() 函數替換成了 sum() 函數。固然了,sum() 函數要求傳入一個指定的列名,表示咱們要彙總這一列的總合,所以這裏咱們傳入了 commentcount 這一列。函數

其它聚合函數的用法也是相似的,就不一一列舉了。由此咱們能夠總結出一些結論,聚合函數都是要使用 rawQuery() 方法進行 SQL 查詢,而後結果會封裝到 Cursor 對象當中,接着咱們再從 Cursor 中將結果取出。雖然說你可能以爲上面的用法已經足夠簡單了,由於總共也就只寫了六七行代碼,可是你有沒有想過更簡單的寫法,好比說只用一行代碼就完成聚合查詢操做。你沒有看錯,就是一行代碼,LitePal 讓這些都成爲了可能,那麼下面咱們就來學習一下 LitePal 中聚合函數的用法。oop

使用 LitePal 的聚合函數

LitePal 中一共提供了 count()、sum()、average()、max() 和 min() 這五種聚合函數,基本上已經將 SQL 語句當中最經常使用的幾種聚合函數都覆蓋了,那麼下面咱們就來對這五種聚合函數的用法一一進行學習。post

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 技術相關的其它文章,感謝你們對本專欄的持續關注。

相關文章
相關標籤/搜索