轉(zhuǎn)載請(qǐng)注明出處:http://blog.csdn.net/guolin_blog/article/details/40614197
在上1篇文章當(dāng)中,我們已把LitePal查詢操作的所有用法都學(xué)習(xí)完了,很明顯,LitePal幫我們提供了非常強(qiáng)大的查詢API,使得我們可以極度輕松地完成各種類型的查詢。但是呢,在SQL語句當(dāng)中,有1種查詢是比較特殊的,就是聚合函數(shù)查詢,它不像傳統(tǒng)查詢1樣是將表中的某些列的數(shù)據(jù)查詢出來,而是將查詢結(jié)果進(jìn)行聚合和統(tǒng)計(jì),終究將統(tǒng)計(jì)后的結(jié)果進(jìn)行返回。因此,任何1個(gè)關(guān)系型數(shù)據(jù)庫中都會(huì)提供像count()、sum()等聚合函數(shù)。那末不出你所料,LitePal當(dāng)中也是對(duì)這些聚合函數(shù)都進(jìn)行了封裝,讓我們的操作可以變得更加簡單。因此,今天我們就來學(xué)習(xí)1下LitePal中聚合函數(shù)的用法,還沒有看過前面1篇文章的朋友建議先去參考 Android數(shù)據(jù)庫高手秘籍(7)――體驗(yàn)LitePal的查詢藝術(shù) 。
LitePal的項(xiàng)目地址是:https://github.com/LitePalFramework/LitePal
雖然說是聚合函數(shù),但它的用法其實(shí)和傳統(tǒng)的查詢還是差不多的,即依然使用的是select語句。但是在select語句當(dāng)中我們通常不會(huì)再去指定列名,而是將需要統(tǒng)計(jì)的列名傳入到聚合函數(shù)當(dāng)中,那末履行select語句使用的還是SQLiteDatabase中的rawQuery()方法。下面我們來嘗試1下,比如說想要統(tǒng)計(jì)news表中1共有多少行,就能夠這樣寫:
那如果我們想要統(tǒng)計(jì)出news表中評(píng)論的總數(shù)量該怎樣寫呢?代碼以下所示:
其它聚合函數(shù)的用法也是類似的,就不逐一羅列了。由此我們可以總結(jié)出1些結(jié)論,聚合函數(shù)都是要使用rawQuery()方法進(jìn)行SQL查詢,然后結(jié)果會(huì)封裝到Cursor對(duì)象當(dāng)中,接著我們?cè)購腃ursor中將結(jié)果取出。雖然說你可能覺得上面的用法已足夠簡單了,由于總共也就只寫了67行代碼,但是你有無想過更簡單的寫法,比如說只用1行代碼就完成聚合查詢操作。你沒有看錯(cuò),就是1行代碼,LitePal讓這些都成了可能,那末下面我們就來學(xué)習(xí)1下LitePal中聚合函數(shù)的用法。
LitePal中1共提供了count()、sum()、average()、max()和min()這5種聚合函數(shù),基本上已將SQL語句當(dāng)中最經(jīng)常使用的幾種聚合函數(shù)都覆蓋了,那末下面我們就來對(duì)這5種聚合函數(shù)的用法逐一進(jìn)行學(xué)習(xí)。
count()方法主要是用于統(tǒng)計(jì)行數(shù)的,剛才演示了如何通過SQL語句來統(tǒng)計(jì)news表中1共有多少行,那末下面我們來看1下如何通過LitePal來實(shí)現(xiàn)一樣的功能,代碼以下所示:
除此以外,LitePal中所有的聚合函數(shù)都是支持聯(lián)綴的,也就是說我們可以在統(tǒng)計(jì)的時(shí)候加入條件語句。比如說想要統(tǒng)計(jì)1共有多少條新聞是零評(píng)論的,就能夠這樣寫:
看完了count()方法應(yīng)當(dāng)是覺得非常簡單吧,剩下的幾個(gè)聚合函數(shù)也是一樣簡單的,我們繼續(xù)來學(xué)習(xí)1下。
sum()方法主要是用于對(duì)結(jié)果進(jìn)行求合的,比如說我們想要統(tǒng)計(jì)news表中評(píng)論的總數(shù)量,就能夠這樣寫:
需要注意的是,sum()方法只能對(duì)具有運(yùn)算能力的列進(jìn)行求合,比如說整型列或浮點(diǎn)型列,如果你傳入1個(gè)字符串類型的列去求合,肯定是得不到任何結(jié)果的,這時(shí)候只會(huì)返回1個(gè)0作為結(jié)果。
average()方法主要是用于統(tǒng)計(jì)平均數(shù)的,比如說我們想要統(tǒng)計(jì)news表中平均每條新聞?dòng)卸嗌僭u(píng)論,就能夠這樣寫:
一樣地,average()方法也只能對(duì)具有運(yùn)算能力的列進(jìn)行求平均值,如果你傳入了1個(gè)字符串類型的列,也是沒法得到任何結(jié)果的,這時(shí)候一樣只會(huì)返回1個(gè)0作為結(jié)果。
max()方法主要用于求出某個(gè)列中最大的數(shù)值,比如我們想要知道news表中所有新聞里面最高的評(píng)論數(shù)是多少,就能夠這樣寫:
那末不用多說,max()方法也只能對(duì)具有運(yùn)算能力的列進(jìn)行求最大值的,希望你在使用的時(shí)候能夠謹(jǐn)記這1點(diǎn)。
min()方法主要用于求出某個(gè)列中最小的數(shù)值,比如我們想要知道news表中所有新聞里面最少的評(píng)論數(shù)是多少,就能夠這樣寫:
現(xiàn)在我們已將LitePal中所有聚合函數(shù)的用法全部都學(xué)習(xí)完了,怎樣樣,是否是感覺非常的簡單?學(xué)完以后相信大家也意想到我在開篇的時(shí)候其實(shí)不是在吹牛皮了,確確切實(shí)只需要1行代碼就能夠完成各種聚合查詢操作了,上面任何1個(gè)統(tǒng)計(jì)操作我們都沒有寫到第2行代碼。
好了,經(jīng)過8篇文章的學(xué)習(xí),我們已將LitePal中最主要的功能基本都學(xué)習(xí)完了,相信你從頭看到這里,也是經(jīng)歷了1個(gè)對(duì)LitePal零認(rèn)識(shí),到目前可以熟練使用LitePal的1個(gè)進(jìn)程。那末我們的這個(gè)Android數(shù)據(jù)庫高手秘籍教程到這里也就要暫停了,這個(gè)系列短時(shí)間不會(huì)再更新,而是等到LitePal發(fā)布了新版本,有了新功能以后才會(huì)對(duì)它繼續(xù)進(jìn)行講授。后面我依然會(huì)繼續(xù)分享更多Android技術(shù)相干的其它文章,感謝大家對(duì)本專欄的延續(xù)關(guān)注。