Android 2.0中电话本contact的全操作(增删改查)


一.前言

     1.1 Android的电话本是sdk通过contentProvider封装好的。我们只要通过sdk提供的Uri和字段来对其进行增、删、改、查。

     1.2 权限 

  1. <uses-permission android:name="android.permission.WRITE_CONTACTS"></uses-permission>  
  2.    <uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>  

     1.3 ContentProvider其实自己管理一个Sqlist数据库文件( .db)。这个文件的路径为/data/data/com.android.providers.contacts/databases/contacts2.db。如图:



     1.4 在模拟器中的电话本里创建几个联系人,打开1.2中的.db文件,可以用数据库查看工具SQLite Expert Professional打开看下,如图:

 

      从上图,可以看出左边是.db文件的表,点开各表后可以看出主要的表有raw_contacts,contacts,data


二. api

      2.1 从api中可以看到android.provider.ContactsContract是sdk2.0的类库,从api和上面的图都可以看出关于电话本主要信息都存在 ContactsContract.Data ContactsContract.RawContacts ContactsContract.Contacts 三张表里

  2.1.1 ContactsContract.Data, ContactsContract.RawContacts, ContactsContract.Contacts 三张表的关联,

ContactsContract.RawContacts表里包含ContactsContract.Contacts的contact_id;ContactsContract.Data表里有ContactsContract.RawContacts的raw_contact_id,和ContactsContract.Contacts的contact_id

  2.2 各数据对应的类库

    2.2.1 Email 对应ContactsContract.CommonDataKinds.Email

Type Alias Data column
String ADDRESS DATA1 Email address itself.
int TYPE DATA2 Allowed values are:

  • TYPE_CUSTOM. Put the actual type in LABEL.
  • TYPE_HOME
  • TYPE_WORK
  • TYPE_OTHER
  • TYPE_MOBILE

String LABEL DATA3  
Email数据有三个字段存储:ADDRESS为Email值;TYPE为类型,当为自定义(TYPE_CUSTOM)时,LABEL字段要写入用户自定义的类型;

   2.2.2 IM 对应 ContactsContract.CommonDataKinds.Im 

Type Alias Data column
String DATA DATA1  
int TYPE DATA2 Allowed values are:

  • TYPE_CUSTOM. Put the actual type in LABEL.
  • TYPE_HOME
  • TYPE_WORK
  • TYPE_OTHER

String LABEL DATA3  
String PROTOCOL DATA5

Allowed values:

  • PROTOCOL_CUSTOM. Also provide the actual protocol name as CUSTOM_PROTOCOL.
  • PROTOCOL_AIM
  • PROTOCOL_MSN
  • PROTOCOL_YAHOO
  • PROTOCOL_SKYPE
  • PROTOCOL_QQ
  • PROTOCOL_GOOGLE_TALK
  • PROTOCOL_ICQ
  • PROTOCOL_JABBER
  • PROTOCOL_NETMEETING

String CUSTOM_PROTOCOL DATA6

Im有5个字段

  2.2.3 Phone 对应 ContactsContract.CommonDataKinds.Phone

Type Alias Data column
String NUMBER DATA1  
int TYPE DATA2 Allowed values are:

  • TYPE_CUSTOM. Put the actual type in LABEL.
  • TYPE_HOME
  • TYPE_MOBILE
  • TYPE_WORK
  • TYPE_FAX_WORK
  • TYPE_FAX_HOME
  • TYPE_PAGER
  • TYPE_OTHER
  • TYPE_CALLBACK
  • TYPE_CAR
  • TYPE_COMPANY_MAIN
  • TYPE_ISDN
  • TYPE_MAIN
  • TYPE_OTHER_FAX
  • TYPE_RADIO
  • TYPE_TELEX
  • TYPE_TTY_TDD
  • TYPE_WORK_MOBILE
  • TYPE_WORK_PAGER
  • TYPE_ASSISTANT
  • TYPE_MMS

String LABEL DATA3

2.2.4 Postal address 通讯地址 对应 ContactsContract.CommonDataKinds.StructuredPostal

Type Alias Data column
String FORMATTED_ADDRESS DATA1  
int TYPE DATA2 Allowed values are:

  • TYPE_CUSTOM. Put the actual type in LABEL.
  • TYPE_HOME
  • TYPE_WORK
  • TYPE_OTHER

String LABEL DATA3  
String STREET DATA4  
String POBOX DATA5 Post Office Box number
String NEIGHBORHOOD DATA6  
String CITY DATA7  
String REGION DATA8  
String POSTCODE DATA9  
String COUNTRY DATA10

最长用的有 TYPE:类型;STREET:街道;CITY:市;REGION:省;POSTCODE:邮政编码;

三.代码

     3.1在api里 ContactsContract.Data 和ContactsContract.RawContacts文档里有关于insert ,update, delete,query的代码,显示出操作各自的表的代码。可以根据这些来完成我们自己的逻辑。

     3.2 查询 (查出全部联系人,在只显示姓名)需要如图:


   需求分析:由于列表中只需要姓名,所以在查询表时就只查询出姓名信息就好。当点击某个联系人再查出Email,phone等详细信息。

   3.2.1 查询联系人总表代码:

说明:由于姓名可以直接在ContactsContract.Contacts表里查到,所以如下

  1. public static final String[] PROJECTION_CONTACTS = { Contacts._ID,  
  2.             Contacts.PHOTO_ID, Contacts.IN_VISIBLE_GROUP,  
  3.             Contacts.HAS_PHONE_NUMBER, Contacts.DISPLAY_NAME,  
  4.             Contacts.CUSTOM_RINGTONE };  
  5.   
  6.     /** 
  7.      * wu0wu 
  8.      *  
  9.      * 功能:查询所有联系人PROJECTION_CONTACTS信息 
  10.      *  
  11.      * */  
  12.     public static void _getContacts(ContentResolver cr) {  
  13.         Cursor cursorContact = null;  
  14.   
  15.         try {  
  16.             cursorContact = cr.query(ContactsContract.Contacts.CONTENT_URI,  
  17.                     PROJECTION_CONTACTS, Contacts.IN_VISIBLE_GROUP + "=1",  
  18.                     nullnull);  
  19.             Log.e("wu0wu""联系人个数=" + cursorContact.getCount());  
  20.             int[] indexs = getColumnIndexs(PROJECTION_CONTACTS, cursorContact);  
  21.   
  22.             while (cursorContact.moveToNext()) {  
  23.                 Log.e("wu0wu""------------------------------------");  
  24.                 for (int i = 0; i < PROJECTION_CONTACTS.length; i++) {  
  25.                     String value = cursorContact.getString(indexs[i]);  
  26.                     Log.e("wu0wu", PROJECTION_CONTACTS[i] + "=" + value);  
  27.                 }  
  28.             }  
  29.         } catch (Exception e) {  
  30.             Log.e("wu0wu", e.toString());  
  31.         } finally {  
  32.             if (cursorContact != null) {  
  33.                 cursorContact.close();  
  34.             }  
  35.         }  
  36.     }  
  37.   
  38.     private static int[] getColumnIndexs(String[] projections, Cursor c) {  
  39.         int[] ret = new int[projections.length];  
  40.         for (int i = 0; i < projections.length; i++) {  
  41.             ret[i] = c.getColumnIndex(projections[i]);  
  42.         }  
  43.         return ret;  
  44.     }  
3.2.2 根据contactId查询联系人详细

相关内容