有時候,咱們須要對查詢的數據庫結果進行去重。在SQL中咱們能夠經過distinct關鍵字實現,可是當咱們使用android提供的managedQuery()或getContentResolver().query()方法對數據庫進行查詢時,並不能使用distinct關鍵字。那麼,如何解決呢? android
首先,讓咱們來了解一下android中query方法吧。 數據庫
當咱們調用android系統的query操做的時候,android會把咱們寫在query方法中的參數構形成一句SQL, 函數
這句SQL的結構是:select projection from table where ( selection ) order by order; spa
projection是咱們要查詢的列; 排序
table是根據Uri肯定的數據庫表; get
selection使咱們本身的查詢條件; io
order是咱們想要的排序方式。 編譯
注意,where語句中的兩個括號是系統本身幫咱們加的。 table
其次,在瞭解了query方法的特色以後,咱們經過什麼方法來去重呢? List
select projection from table where ( selection ) group by ( group ) order by order;
經過在query方法中構造相似上面的SQL語句,就能夠簡單實現去重的效果。核心是對要進行去重的列進行分組!
最後,在query方法中進行使用這個方法。(以getContentResolver().query()爲例)
假設咱們有一張表consume,用來記錄消費者每一年每個月的消費信息,
咱們使用ExpandableListView顯示消費者在特定年份每月的消費狀況。
(由於每月的消費信息不可能只有一條,因此咱們要對相同月份的消費信息進行去重)
那麼咱們的查詢語句應該是:
getContentResolver().query( Consume.CONTENT_URI , // Uri
null , // 查詢全部列
Consume.YEAR + " = " + yearValue + " ) " // 與系統中where的左括號'('配對,完成構造where查詢條件
+ " group by " + " ( " + Consume.MONTH // 與系統中where的右括號')'配對,完成構造Group By語句
. Consume.MONTH + " ASC " ); // 升序排列月份
android系統會把上面的函數編譯爲以下格式的SQL語句:
select * from consume where ( year = yearValue ) group by ( month ) order by month ASC;
// yearValue是咱們給定的值,如yearValue = 2012,則查詢2012年每月的消費信息
這樣咱們查到的Cursor就沒有重複的月份了。
總結
上面的方法是巧妙的利用了系統在構造where時自動添加的'('和')',進而經過分組(group by)的方式實現去重效果.