最近在工作中频繁的接触到联系人的查询,开始傻了吧唧的查询所有的联系人,然后去过滤自己想要的。
但如果在手机中联系人比较少的时候可以这么做,一旦多起来,还有一些情况下,会使得查询速度达不到理想状态,
之后和同事交流发现其实不用那么麻烦。/**
* 处理本地搜索
* @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以上查询联系人不同的问题。
分享一下,希望大家都少走弯路。
但如果在手机中联系人比较少的时候可以这么做,一旦多起来,还有一些情况下,会使得查询速度达不到理想状态,
之后和同事交流发现其实不用那么麻烦。/**
* 处理本地搜索
* @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以上查询联系人不同的问题。
分享一下,希望大家都少走弯路。
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货