android 联系人查询结果的排序问题

原创 2011年01月13日 23:00:00

      最近,有需要要查询android 1.6联系人的数据库,而且需要将查询出来的联系人排好顺序。按照ContentResolver的query函数的文档,它的原型为:

query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)

      第二个参数为返回结果的列数,第三、四个参数对应SQL语句中的where后面的部分,最后一个参数是SQL语句中的order by后面的部分。

      第三、四个参数可以用来模糊查询,比如下面的用法:

query(People.CONTENT_URI, null, People.NAME + " LIKE ?", new String[] { "%M%" }, 
    People.NAME + " collate NOCASE DESC");
      这句话等价于SQL语句的:
select * from people where name like '%M%' order by name collate NOCASE desc;

      这句话的意思是查询数据表为people的name字段中包含M的联系人。

      由于,query是android对select语句的封装,应此可以将name like放在第三个参数中,带单引号的值放在第四个参数中,当然,也可以将第三个参数改为People.NAME + “ LIKE ‘%M%'",而第四个参数则为null,也即如下的形式:

query(People.CONTENT_URI, null, People.NAME + " LIKE '%M%'", null,
    People.NAME + " collate NOCASE DESC");

      很明显,第四个参数用来表示第三个参数的?号部分,而且是可以省略单引号的。

      让我们来看一下第五个参数,由于name列在数据库中collate属性被定义为LOCALIZED。因此,参照sqlite的文档,需要加collate说明(http://www.sqlite.org/datatype3.html,6.0节),具体可参考如下说明:

      When SQLite compares two strings, it uses a collating sequence or collating function (two words for the same thing) to determine which string is greater or if the two strings are equal. SQLite has three built-in collating functions: BINARY, NOCASE, and RTRIM.

      BINARY - Compares string data using memcmp(), regardless of text encoding.
      NOCASE - The same as binary, except the 26 upper case characters of ASCII are folded to their lower case equivalents before the comparison is performed. Note that only ASCII characters are case folded. SQLite does not attempt to do full UTF case folding due to the size of the tables required.
      RTRIM - The same as binary, except that trailing space characters are ignored.

      也就是说,它是用来指定排序规则,若不指定,sqlite expert中执行时会报错。但是,由于android的封装,第5个参数的collate部分可以省略(估计android默认替你选了一个)。

版权声明:本文为博主原创文章,未经博主允许不得转载。

android sqlite query 按照 id 降序排列

db.query(TABLE_NAME, projection, null, null, null, null, "id desc"); 这里的 desc 必须是小写,和 id 之间有个空格...
  • liangjiu2009
  • liangjiu2009
  • 2014年02月20日 18:06
  • 5287

Android开发中SQLite存储时间和按日期函数查询

1.存储时间字段; 2.查询结果按时间进行排序; 3.指定时间范围查询,按年或者按月 ; 4.DAO设计模式操作数据库 ; 5.RxJava异步执行数据库操作 ;...
  • hexingen
  • hexingen
  • 2017年05月10日 21:26
  • 2881

hibernate mysql 倒序排列 并分页(取前n条记录)

在User表中找出最后五条记录 sql正序排列: select * from user order by id; sql倒序排列: select * from us...
  • mr_orange_klj
  • mr_orange_klj
  • 2015年01月16日 15:18
  • 5973

一句SQL语句解决倒序数据分页提取

一句SQL语句解决倒序数据分页提取此解决方案可能比不上网上那些大段代码的store procedure的性能(性能测试我就免了),我以前也写过那样的Store Procedure或C#代码,不过简单就...
  • eqiang8271
  • eqiang8271
  • 2008年05月19日 21:04
  • 2028

Android数据库中查找一条数据 query方法详解

public Cursor query(String table,String[] columns,String selection,String[] selectionArgs,String gro...
  • chaozhung
  • chaozhung
  • 2013年06月05日 09:47
  • 9831

Android 使用ListView的A-Z字母排序功能实现联系人模块

在上一篇文章当中,主要学习了ListView的A-Z字母排序功能以及根据输入框的输入值改变来过滤搜索结果,如果输入框里面的值为空,更新为原来的列表,否则为过滤数据列表,包括汉字转成拼音的功能,如果你还...
  • qq_20785431
  • qq_20785431
  • 2016年03月02日 16:51
  • 4613

Android -SQLite数据库存储

android 系统集成了一个轻量级的数据库,SQLite只是一个嵌入式的数据库引擎;android提供SQLiteDatabase代表一个数据库,一旦应用程序获得了SQLiteDatabase对象,...
  • TaooLee
  • TaooLee
  • 2015年10月23日 11:02
  • 1529

Android SQLite分页查询的三种方法

闲话不多说,直入话题,SQLite分页查询有三种方法,它们都是基于SQLite SQL查询来的,首先我们看下SQLite分页查询的SQL语句,有助于我们理解: 1 ...
  • lu1024188315
  • lu1024188315
  • 2016年06月22日 15:18
  • 9392

Android自定义控件---联系人列表A-Z排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 这几天在做IM模块,设计图要求做一个类似下图所示的自定义控件。 我百度了一下,发现类似的Ddmo有很多,但是还不能完全满足设计图的...
  • qq_35114086
  • qq_35114086
  • 2016年11月30日 13:29
  • 1805

Android根据联系人姓名首字符顺序读取通讯录

本文给出了Android读取通讯录联系人的一般方法,且在读取Android通讯录联系人时候,将结果有序化(按照联系人姓名的首字符依次顺序读取:A ~ Z)。 读取的结果如图所示: 现给...
  • zhangphil
  • zhangphil
  • 2015年08月03日 08:46
  • 4194
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android 联系人查询结果的排序问题
举报原因:
原因补充:

(最多只允许输入30个字)