android 查询联系人

dinjay 2010-08-02 10:14:03
最近在工作中频繁的接触到联系人的查询,开始傻了吧唧的查询所有的联系人,然后去过滤自己想要的。
但如果在手机中联系人比较少的时候可以这么做,一旦多起来,还有一些情况下,会使得查询速度达不到理想状态,
之后和同事交流发现其实不用那么麻烦。

/**
* 处理本地搜索
* @param content---搜索内容
*/


public List<ItemDate> searchInfo(String content){

List<ItemDate> list = new ArrayList<ItemDate>();

Log.i("LSR","----------search start---------content:"+content);

if(content == null || content.length()==0 || content.equals(" "))
return list;
Cursor cursorInbox = getContentResolver().query(Uri.parse("content://sms/inbox"),
null, null, null, null);//获取收件箱信息,可以查询收件箱

Cursor cursorSendbox = getContentResolver().query(Uri.parse("content://sms/sent"),
null, null, null, null);//发件箱信息,可以查询发件箱

Uri personUri = null;
String columnName = null;
if(SDK_VERSION>4){//2.x,sdk版本
personUri = Uri.parse("content://com.android.contacts/contacts");//new Uri("content://com.android.contacts/contacts");
columnName = "display_name";
}else{//1.6以下SDK
personUri = Contacts.People.CONTENT_URI;
columnName = Contacts.People.NAME;
}
String tmpNum = new String();//记录临时号码
//处理联系人和邮件
Cursor c = getContentResolver().query(personUri,
null, columnName+" like \'%"+content+"%\'", null, null);//查询所有包含content的名字
Cursor newcur = null; //处理邮箱的获取
//获取联系人姓名
for(c.moveToFirst();!c.isAfterLast();c.moveToNext()){
int iNameIndex = c.getColumnIndex(columnName);
String stringName = c.getString(iNameIndex);
//2.x需要对名和姓做拼接
stringName = getPersonName(stringName);

String number = getPersonNumber(c);

//处理邮件
String email = getPersonEmail(newcur, c);
//判断是否存在联系人
//忽略大小写
if(regionMatches(content, stringName)){
list.add(new ItemDate(stringName, number, email, ID_NUMBER, 0));//添加联系人信息
tmpNum = number;
if(email!=null && email.length()>0)
list.add(new ItemDate(stringName, number, email, ID_EMAIL, 0));//添加邮件信息

}

//用完关闭
if(newcur != null){
newcur.close();
newcur = null;
}
if(c != null){
c.close();
c = null;
}
if(cursorInbox != null){
cursorInbox.close();
cursorInbox = null;
}
if(cursorSendbox != null){
cursorSendbox.close();
cursorSendbox = null;
}
return list;
// updatelist();
}


关键是这句:

Cursor c = getContentResolver().query(personUri,
null, columnName+" like \'%"+content+"%\'", null, null);//查询所有包含content的名字

这里查询出来的就是对含有content字段的内容,这样就不用全都取出来去遍历了。节省了时间。
而且我这里查询是在子线程中进行的,查询后会通知在主线程去更新UI。
里面也解决了1.6和2.0以上查询联系人不同的问题。
分享一下,希望大家都少走弯路。
...全文
1822 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
xubo115 2012-05-02
  • 打赏
  • 举报
回复
最近用到这个。。还得再研究
rickykaka1899 2011-11-02
  • 打赏
  • 举报
回复
不错 看看。
xinyan2xh 2011-11-01
  • 打赏
  • 举报
回复
mark
yeyanbinghappy 2011-08-09
  • 打赏
  • 举报
回复
非常好
傲慢的上校 2011-08-09
  • 打赏
  • 举报
回复
非常好
wfkbyni 2011-01-13
  • 打赏
  • 举报
回复
貌似这里查询收件箱跟发件箱没有做任何操作吧?
little3257 2010-12-05
  • 打赏
  • 举报
回复
不出来说好,对不起大家
VSAPAIN 2010-09-15
  • 打赏
  • 举报
回复
绝对精华帖 必须要顶
yingwei19800524 2010-08-06
  • 打赏
  • 举报
回复
不错。。。。
aimshiny 2010-08-02
  • 打赏
  • 举报
回复
很不错的思路,谢谢分享
tqwboy 2010-08-02
  • 打赏
  • 举报
回复
好贴,顶
vclongking 2010-08-02
  • 打赏
  • 举报
回复
帮顶起来先

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧