有时候,咱们须要对查询的数据库结果进行去重。在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)的方式实现去重效果.