如何在managedQuery()和getContentResolver().query()方法中實現結果去重
有時候,我們需要對查詢的數據庫結果進行去重。在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”