0
点赞
收藏
分享

微信扫一扫

Pro Android学习笔记(一六三):联系人API(6):联系人详细信息

王老师说 2023-04-10 阅读 42


作者@恺风Wei。

在前面我们学习过,数据库中有raw_contacts表并没有存放联系人的所有信息,而是在data表中存放的,例如具体的电话号码,电子邮件等等。数据库给出视图view_entities,合并raw_contacts和data,以便可以从中获取某个raw contact的全部的详细信息。下面的小例子将演示如果通过ContactsContract.RawContactsEntity.CONTENT_URI来读取详细信息。

Raw Contacts Entity提供的信息

代码和之前获取整合联系人以及raw contact的表头信息类似,只是URI不同,Raw contacts的URI为ContactsContract.RawContactsEntity.CONTENT_URI。代码不再给出,输入结果为:

Pro Android学习笔记(一六三):联系人API(6):联系人详细信息_数据库

显示某个整合ID或raw contact的详细信息

我们在下面的小例子中读取整合ID为1和2的raw contact的信息。在我的华为手机中,这个raw contact分别为国际漫游服务和华为客服,相关信息如下:

Pro Android学习笔记(一六三):联系人API(6):联系人详细信息_SQL_02

和之前的小例子一样,构造一个类来存放这些entity的信息,我们选取了部分内容。注意到部分的信息的列名称采用了ContactsContract.RawContacts,而非ContactsContract.RawContactsEntity,这是因为RawContactsEntity的内容来自data表,而所读取的视图view_entities信息比data表的要多,部分列名字来着RawContacts。

public class ContactInfo { 
     public String rawContactId; 
     public String aggregatedContactId; 
     public String dataId; 
     public String accountName; 
     public String accountType; 
     public String mimetype; 
     public String data1; 
      
     public void fillinFrom(Cursor c){ 
         rawContactId = BaseTest.getColumnValue(c,"_ID"); 
         accountName = BaseTest.getColumnValue(c,ContactsContract.RawContacts.ACCOUNT_NAME);
         accountType = BaseTest.getColumnValue(c,ContactsContract.RawContacts.ACCOUNT_TYPE);
         aggregatedContactId = BaseTest.getColumnValue(c,ContactsContract.RawContacts.CONTACT_ID);
        mimetype = BaseTest.getColumnValue(c,ContactsContract.RawContactsEntity.MIMETYPE);
         data1 = BaseTest.getColumnValue(c,ContactsContract.RawContactsEntity.DATA1);
         dataId = BaseTest.getColumnValue(c,ContactsContract.RawContactsEntity.DATA_ID);
     } 
     
    public String toString() 
     { 
         return data1 + "/" + mimetype 
             + "/" + accountName + ":" + accountType 
             + "/" + dataId + "/" + rawContactId  + "/" + aggregatedContactId; 
     } 
 }

下面是读取的代码:

private void showSomeEntries(int id1, int id2){ 
     Cursor c = null; 
     try{ 
         c = getACurosor(ContactsContract.RawContactsEntity.CONTENT_URI.toString(),
                 "contact_id in ("+ id1 + ","+ id2 +")");  //设定了SQL的where条件,这里给出2个整合ID的信息,如果是raw contact的ID,对应的就是_id。 
        if(c != null){ 
             showEntries(c); 
         } 
     }finally{ 
         if(c!= null) 
             c.close(); 
     }            
 } 

 private void showEntries(Cursor c ){ 
     int num = 0; 
     for(c.moveToFirst(); !c.isAfterLast() ; num ++,c.moveToNext()){ 
         ContactInfo one = new ContactInfo(); 
         one.fillinFrom(c); 
         showInfo("【" + num + "】" + one.toString()); 
     } 
 } 

 private Cursor getACurosor(String uri, String clause){ 
     ContentResolver cv = mContext.getContentResolver(); 
     return cv.query(Uri.parse(uri), null, clause, null, null);    
 } 

private void showInfo(String info){ 
     …… 
 }

调用showSomeEntries(1,2);后,得到:

Pro Android学习笔记(一六三):联系人API(6):联系人详细信息_SQL_03

 

小例子下载。


举报

相关推荐

0 条评论