Android 2.0中电话本contact的全操作(增删改查)
Android 2.0中电话本contact的全操作(增删改查)
一.前言
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
Email数据有三个字段存储:ADDRESS为Email值;TYPE为类型,当为自定义(TYPE_CUSTOM)时,LABEL字段要写入用户自定义的类型;
Type Alias Data column String ADDRESS
DATA1
Email address itself. int TYPE
DATA2
Allowed values are:
TYPE_CUSTOM
. Put the actual type inLABEL
.TYPE_HOME
TYPE_WORK
TYPE_OTHER
TYPE_MOBILE
String LABEL
DATA3
2.2.2 IM 对应 ContactsContract.CommonDataKinds.Im
Im有5个字段
Type Alias Data column String DATA
DATA1
int TYPE
DATA2
Allowed values are:
TYPE_CUSTOM
. Put the actual type inLABEL
.TYPE_HOME
TYPE_WORK
TYPE_OTHER
String LABEL
DATA3
String PROTOCOL
DATA5
Allowed values:
PROTOCOL_CUSTOM
. Also provide the actual protocol name asCUSTOM_PROTOCOL
.PROTOCOL_AIM
PROTOCOL_MSN
PROTOCOL_YAHOO
PROTOCOL_SKYPE
PROTOCOL_QQ
PROTOCOL_GOOGLE_TALK
PROTOCOL_ICQ
PROTOCOL_JABBER
PROTOCOL_NETMEETING
String CUSTOM_PROTOCOL
DATA6
2.2.3 Phone 对应 ContactsContract.CommonDataKinds.Phone
2.2.4 Postal address 通讯地址 对应 ContactsContract.CommonDataKinds.StructuredPostal
Type Alias Data column String NUMBER
DATA1
int TYPE
DATA2
Allowed values are:
TYPE_CUSTOM
. Put the actual type inLABEL
.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
最长用的有 TYPE:类型;STREET:街道;CITY:市;REGION:省;POSTCODE:邮政编码;
Type Alias Data column String FORMATTED_ADDRESS
DATA1
int TYPE
DATA2
Allowed values are:
TYPE_CUSTOM
. Put the actual type inLABEL
.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
三.代码
3.1在api里 ContactsContract.Data 和ContactsContract.RawContacts文档里有关于insert ,update, delete,query的代码,显示出操作各自的表的代码。可以根据这些来完成我们自己的逻辑。
3.2 查询 (查出全部联系人,在只显示姓名)需要如图:
需求分析:由于列表中只需要姓名,所以在查询表时就只查询出姓名信息就好。当点击某个联系人再查出Email,phone等详细信息。
3.2.1 查询联系人总表代码:
说明:由于姓名可以直接在ContactsContract.Contacts表里查到,所以如下
3.2.2 根据contactId查询联系人详细
- public static final String[] PROJECTION_CONTACTS = { Contacts._ID,
- Contacts.PHOTO_ID, Contacts.IN_VISIBLE_GROUP,
- Contacts.HAS_PHONE_NUMBER, Contacts.DISPLAY_NAME,
- Contacts.CUSTOM_RINGTONE };
- /**
- * wu0wu
- *
- * 功能:查询所有联系人PROJECTION_CONTACTS信息
- *
- * */
- public static void _getContacts(ContentResolver cr) {
- Cursor cursorContact = null;
- try {
- cursorContact = cr.query(ContactsContract.Contacts.CONTENT_URI,
- PROJECTION_CONTACTS, Contacts.IN_VISIBLE_GROUP + "=1",
- null, null);
- Log.e("wu0wu", "联系人个数=" + cursorContact.getCount());
- int[] indexs = getColumnIndexs(PROJECTION_CONTACTS, cursorContact);
- while (cursorContact.moveToNext()) {
- Log.e("wu0wu", "------------------------------------");
- for (int i = 0; i < PROJECTION_CONTACTS.length; i++) {
- String value = cursorContact.getString(indexs[i]);
- Log.e("wu0wu", PROJECTION_CONTACTS[i] + "=" + value);
- }
- }
- } catch (Exception e) {
- Log.e("wu0wu", e.toString());
- } finally {
- if (cursorContact != null) {
- cursorContact.close();
- }
- }
- }
- private static int[] getColumnIndexs(String[] projections, Cursor c) {
- int[] ret = new int[projections.length];
- for (int i = 0; i < projections.length; i++) {
- ret[i] = c.getColumnIndex(projections[i]);
- }
- return ret;
- }
评论暂时关闭