getContentResolver().query()方法selection参数使用详解(转)
如何在managedQuery()和getContentResolver().query()方法中實(shí)現(xiàn)結(jié)果去重
有時(shí)候,我們需要對查詢的數(shù)據(jù)庫結(jié)果進(jìn)行去重。在SQL中我們可以通過distinct關(guān)鍵字實(shí)現(xiàn),但是當(dāng)我們使用android提供的managedQuery()或getContentResolver().query()方法對數(shù)據(jù)庫進(jìn)行查詢時(shí),并不能使用distinct關(guān)鍵字。那么,如何解決呢?
首先,讓我們來了解一下android中query方法吧。
當(dāng)我們調(diào)用android系統(tǒng)的query操作的時(shí)候,android會(huì)把我們寫在query方法中的參數(shù)構(gòu)造成一句SQL,
這句SQL的結(jié)構(gòu)是:select projection from table where?(?selection?)?order by order;
projection是我們要查詢的列;
table是根據(jù)Uri確定的數(shù)據(jù)庫表;
selection使我們自己的查詢條件;
order是我們想要的排序方式。
注意,where語句中的兩個(gè)括號是系統(tǒng)自己幫我們加的。
其次,在了解了query方法的特點(diǎn)之后,我們通過什么方法來去重呢?
select projection from table where?(?selection?)? group by ( group?)?order by order;
通過在query方法中構(gòu)造類似上面的SQL語句,就可以簡單實(shí)現(xiàn)去重的效果。核心是對要進(jìn)行去重的列進(jìn)行分組!
最后,在query方法中進(jìn)行使用這個(gè)方法。(以getContentResolver().query()為例)
假設(shè)我們有一張表consume,用來記錄消費(fèi)者每年每月的消費(fèi)信息,
我們使用ExpandableListView顯示消費(fèi)者在特定年份每個(gè)月的消費(fèi)情況。
(因?yàn)槊總€(gè)月的消費(fèi)信息不可能只有一條,所以我們要對相同月份的消費(fèi)信息進(jìn)行去重)
那么我們的查詢語句應(yīng)該是:
getContentResolver().query( Consume.CONTENT_URI , // Uri
null , // 查詢所有列
Consume.YEAR + " = " + yearValue?+?" ) "?// 與系統(tǒng)中where的左括號'('配對,完成構(gòu)造where查詢條件
+?" group by " +?" ( "?+?Consume.MONTH // 與系統(tǒng)中where的右括號')'配對,完成構(gòu)造Group By語句
. Consume.MONTH + " ASC "?); // 升序排列月份
android系統(tǒng)會(huì)把上面的函數(shù)編譯為如下格式的SQL語句:
select * from consume where ( year = yearValue ) group by ( month ) order by month ASC;
// yearValue是我們給定的值,如yearValue = 2012,則查詢2012年每個(gè)月的消費(fèi)信息
這樣我們查到的Cursor就沒有重復(fù)的月份了。
總結(jié)
上面的方法是巧妙的利用了系統(tǒng)在構(gòu)造where時(shí)自動(dòng)添加的'('和')',進(jìn)而通過分組(group by)的方式實(shí)現(xiàn)去重效果.
?
轉(zhuǎn)自“http://www.cnblogs.com/Lefter/archive/2012/08/08/2628621.html”
轉(zhuǎn)載于:https://www.cnblogs.com/ftrako/p/5244483.html
總結(jié)
以上是生活随笔為你收集整理的getContentResolver().query()方法selection参数使用详解(转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vc服务器的作用,总结虚拟化服务器的好处
- 下一篇: 记录一次使用Aliyun OSS 存图片