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

      最近,有需要要查询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默认替你选了一个)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用Android中的ListView和Adapter来实现好友联系人按字母排序分组的功能。具体步骤如下: 1. 首先需要将好友联系人的数据按照首字母进行排序,可以使用Collections.sort()方法实现。 2. 接着,需要将排序后的数据按照首字母分组,可以使用HashMap来存储。 3. 创建一个自定义的Adapter并重写getView()方法,在getView()方法中根据不同的位置展示不同的数据。 4. 最后,将Adapter设置给ListView即可。 下面是一个简单的示例代码,仅供参考: ``` // 好友联系人数据 List<Contact> contacts = new ArrayList<>(); // 对数据按照首字母进行排序 Collections.sort(contacts); // 按照首字母分组存储数据 HashMap<String, List<Contact>> contactMap = new HashMap<>(); for (Contact contact : contacts) { String firstLetter = contact.getName().substring(0, 1); if (contactMap.containsKey(firstLetter)) { contactMap.get(firstLetter).add(contact); } else { List<Contact> list = new ArrayList<>(); list.add(contact); contactMap.put(firstLetter, list); } } // 自定义Adapter class ContactAdapter extends BaseAdapter { private List<String> letters; private HashMap<String, List<Contact>> contactMap; private LayoutInflater inflater; public ContactAdapter(List<String> letters, HashMap<String, List<Contact>> contactMap, Context context) { this.letters = letters; this.contactMap = contactMap; inflater = LayoutInflater.from(context); } @Override public int getCount() { return letters.size(); } @Override public Object getItem(int position) { return contactMap.get(letters.get(position)); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = inflater.inflate(R.layout.item_contact, null); holder = new ViewHolder(); holder.tvLetter = convertView.findViewById(R.id.tv_letter); holder.lvContacts = convertView.findViewById(R.id.lv_contacts); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } // 设置首字母 holder.tvLetter.setText(letters.get(position)); // 设置联系人列表 List<Contact> contacts = contactMap.get(letters.get(position)); ContactListAdapter adapter = new ContactListAdapter(contacts, inflater); holder.lvContacts.setAdapter(adapter); return convertView; } class ViewHolder { TextView tvLetter; ListView lvContacts; } } // 自定义联系人列表Adapter class ContactListAdapter extends BaseAdapter { private List<Contact> contacts; private LayoutInflater inflater; public ContactListAdapter(List<Contact> contacts, LayoutInflater inflater) { this.contacts = contacts; this.inflater = inflater; } @Override public int getCount() { return contacts.size(); } @Override public Object getItem(int position) { return contacts.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = inflater.inflate(R.layout.item_contact_list, null); holder = new ViewHolder(); holder.tvName = convertView.findViewById(R.id.tv_name); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.tvName.setText(contacts.get(position).getName()); return convertView; } class ViewHolder { TextView tvName; } } ``` 在上述示例代码中,我们首先将好友联系人按照首字母排序并分组,然后使用自定义的ContactAdapter来展示数据。在ContactAdapter中,我们重写了getView()方法来展示分组后的数据,其中使用了一个自定义的ContactListAdapter来展示每个分组中的联系人。需要注意的是,ListView的高度需要设置为wrap_content,否则可能会导致只显示一个分组的问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值