標籤:
有時候,我們需要對查詢的資料庫結果進行去重。在SQL中我們可以通過distinct關鍵字實現,但是當我們使用android提供的managedQuery()或getContentResolver().query()方法對資料庫進行查詢時,並不能使用distinct關鍵字。那麼,如何解決呢?
首先,讓我們來瞭解一下android中query方法吧。
當我們調用android系統的query操作的時候,android會把我們寫在query方法中的參數構造成一句SQL,
這句SQL的結構是:select projection from table where ( selection ) order by order;
projection是我們要查詢的列;
table是根據Uri確定的資料庫表;
selection使我們自己的查詢條件;
order是我們想要的排序方式。
注意,where語句中的兩個括弧是系統自己幫我們加的。
其次,在瞭解了query方法的特點之後,我們通過什麼方法來去重呢?
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)的方式實現去重效果.
轉自“http://www.cnblogs.com/Lefter/archive/2012/08/08/2628621.html”
getContentResolver().query()方法selection參數使用詳解(轉)