如何在managedQuery()和getContentResolver().query()方法中实现结果去重

如何在managedQuery()和getContentResolver().query()方法中实现结果去重有时候,我们需要对查询的数据库结果进行去重。在SQL中我们可以通过distinct关键字实现,但是当我们使用android提供的managedQuery()或getContentResolver().query()方法对数据库进行查询时,并不能使用distinct关键字。那么,如何解决呢?首先,让我们来了解一下android中query方法吧。  当我们调用android系统的query操

如何在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)的方式实现去重效果.

今天的文章如何在managedQuery()和getContentResolver().query()方法中实现结果去重分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/30203.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注