查询ContactsContract以同时获取电子邮件,电话和地址的最佳方法是什么?

问题描述:

据我所知,似乎没有办法将表连接在一起。我知道我可以查询电话,结构化邮递(地址)或电子邮件的CommonDataKinds表,但我似乎无法找到一种方法来一次查询所有三个。查询ContactsContract以同时获取电子邮件,电话和地址的最佳方法是什么?

我只得到一个Cursor,它具有其中一个但不是聚合投影。

有人对我如何实现这样的事情有一些建议吗?

这里是我得到StructuredPostal查询目前看起来像:

public static Cursor getAddressCursor(ContentResolver contactHelper, String startsWith) { 
    logger.v("getAddressCursor"); 
    Cursor cursor = null; 
    try { 
     if (startsWith != null && !startsWith.equals("")) { 
      cursor = contactHelper.query(
        ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_URI, 
        null, 
        ContactsContract.Contacts.DISPLAY_NAME + " LIKE '" + startsWith + "%'", 
        null, 
        ContactsContract.Contacts.DISPLAY_NAME + " ASC"); 
     } else { 
      cursor = contactHelper.query(
        ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_URI, 
        null, 
        null, 
        null, 
        ContactsContract.Contacts.DISPLAY_NAME + " ASC"); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return cursor; 
} 

我怎么会去聚集电话和电子邮件到这一点?

您可以使用此方法:

public void readContacts(){ 
    ContentResolver cr = getContentResolver(); 
    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, 
      null, null, null, null); 

    if (cur.getCount() > 0) { 
     while (cur.moveToNext()) { 
      String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID)); 
      String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
      if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { 
       System.out.println("name : " + name + ", ID : " + id); 

       // get the <span class="IL_AD" id="IL_AD4">phone number</span> 
       Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null, 
             ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", 
             new String[]{id}, null); 
       while (pCur.moveToNext()) { 
         String phone = pCur.getString(
          pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
         System.out.println("phone" + phone); 
       } 
       pCur.close(); 


       // get email and type 

       Cursor emailCur = cr.query(
         ContactsContract.CommonDataKinds.Email.CONTENT_URI, 
         null, 
         ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", 
         new String[]{id}, null); 
       while (emailCur.moveToNext()) { 
        // This would allow you get several email addresses 
         // if the email addresses were stored in an array 
        String email = emailCur.getString(
            emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); 
        String emailType = emailCur.getString(
            emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE)); 

        System.out.println("Email " + email + " Email Type : " + emailType); 
       } 
       emailCur.close(); 

       // Get note....... 
       String noteWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; 
       String[] noteWhereParams = new String[]{id, 
       ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE}; 
         Cursor noteCur = cr.query(ContactsContract.Data.CONTENT_URI, null, noteWhere, noteWhereParams, null); 
       if (noteCur.moveToFirst()) { 
        String note = noteCur.getString(noteCur.getColumnIndex(ContactsContract.CommonDataKinds.Note.NOTE)); 
        System.out.println("Note " + note); 
       } 
       noteCur.close(); 

       //Get Postal Address.... 

       String addrWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; 
       String[] addrWhereParams = new String[]{id, 
        ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE}; 
       Cursor addrCur = cr.query(ContactsContract.Data.CONTENT_URI, 
          null, null, null, null); 
       while(addrCur.moveToNext()) { 
        String poBox = addrCur.getString(
           addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POBOX)); 
        String street = addrCur.getString(
           addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET)); 
        String city = addrCur.getString(
           addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY)); 
        String state = addrCur.getString(
           addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.REGION)); 
        String postalCode = addrCur.getString(
           addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE)); 
        String country = addrCur.getString(
           addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY)); 
        String type = addrCur.getString(
           addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.TYPE)); 

        // Do something with these.... 

       } 
       addrCur.close(); 

       // Get Instant Messenger......... 
       String imWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; 
       String[] imWhereParams = new String[]{id, 
        ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE}; 
       Cursor imCur = cr.query(ContactsContract.Data.CONTENT_URI, 
         null, imWhere, imWhereParams, null); 
       if (imCur.moveToFirst()) { 
        String imName = imCur.getString(
          imCur.getColumnIndex(ContactsContract.CommonDataKinds.Im.DATA)); 
        String imType; 
        imType = imCur.getString(
          imCur.getColumnIndex(ContactsContract.CommonDataKinds.Im.TYPE)); 
       } 
       imCur.close(); 

       // Get Organizations......... 

       String orgWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; 
       String[] orgWhereParams = new String[]{id, 
        ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE}; 
       Cursor orgCur = cr.query(ContactsContract.Data.CONTENT_URI, 
          null, orgWhere, orgWhereParams, null); 
       if (orgCur.moveToFirst()) { 
        String orgName = orgCur.getString(orgCur.getColumnIndex(ContactsContract.CommonDataKinds.Organization.DATA)); 
        String title = orgCur.getString(orgCur.getColumnIndex(ContactsContract.CommonDataKinds.Organization.TITLE)); 
       } 
       orgCur.close(); 
      } 
     } 
    } 
} 

你会得到电话号码,电子邮件,笔记,邮寄地址等

+2

妈,有没有办法从一个大数据表怎么做呢? –

+0

谢谢Rahul Sharma,很好的解释... !!! –