一.前言 1.1 Android的电话本是sdk通过contentProvider封装好的。我们只要通过sdk提供的Uri和字段来对其进行增、删、改、查。 1.2 权限
- <uses-permission android:name="android.permission.WRITE_CONTACTS"></uses-permission>
- <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表里查到,所以如下
-