通过PhoneLookup读取所有电话号码

读取Android系统的通讯录时一般会先读取联系人然后再读取其号码,嵌套循环读取。如果通讯录人数不多速度尚可,但是通讯录里有1-2百人恐怕就比较慢了,如果硬件再差点体验就更差了。可以使用
ContactsContract.CommonDataKinds.Phone.CONTENT_URI(对应contacts2.db的数据视图view_data_restricted)视图来读取避免嵌套读取,而对于PhoneLookup.CONTENT_FILTER_URI确不能直接使用,这里分享一下小技巧。

正文

  一、PhoneLookup.CONTENT_FILTER_URI的一般用法

Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI,Uri.encode(phoneNumber));
resolver.query(uri,
newString[]{PhoneLookup.DISPLAY_NAME,...
复制代码

    API见这里。如果直接如下使用PhoneLookup.CONTENT_FILTER_URI会报IllegalArgumentException错

getContentResolver().query(PhoneLookup.CONTENT_FILTER_URI,...

  二、 技巧用法

Cursor c = getContentResolver().query(Uri.withAppendedPath(
PhoneLookup.CONTENT_FILTER_URI,
"*"),new String[] {
PhoneLookup._ID,
PhoneLookup.NUMBER,
PhoneLookup.DISPLAY_NAME,
PhoneLookup.TYPE, PhoneLookup.LABEL },
null,null, sortOrder);
复制代码

    这个"*",这样就能取到所有的号码以及相关的联系人的姓名以及其他相关字段,比通过联系人再查找其号码要方便很多。

 

 转载自:

    博客园:http://www.cnblogs.com

    农民伯伯: http://over140.cnblogs.com

cursor注意地方:

一、数据库的Cursor
  对于AndroidSQLite数据库封装的查询返回对象Cursor来说比较容易出错的有
  1.Cursor返回可能为null
  如果query返回的Cursor对象为空,执行cursor的任何方法肯定有空指针异常了,这点Android的代码有40%都没有注意到。
  2.Cursor返回为0
  我们仅仅判断不为空还不行,如果Cursor的对象为0,执行了moveToFirst();这样的方法就比较尴尬了,这点Android开发网格外提示大家注意。
  3.遍历Cursor时没有执行moveToFirst(),这样游标的位置就不确定了。
  4.Cursor使用完后要手动关闭,cursor.close()这个方法不要忘记了。
  5.Cursor的类型获取,比如说getInt和getLong,由于在SQLite中boolean和long型均为SQLite的Integer所以,读取时一定记住转换。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值