最近在工作中频繁的接触到联系人的查询,开始傻了吧唧的查询所有的联系人,然后去过滤自己想要的。
但如果在手机中联系人比较少的时候可以这么做,一旦多起来,还有一些情况下,会使得查询速度达不到理想状态,
之后和同事交流发现其实不用那么麻烦。/**
* 处理本地搜索
* @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以上查询联系人不同的问题。
分享一下,希望大家都少走弯路。