歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android 2.0中電話本contact的全操作(增刪改查)

Android 2.0中電話本contact的全操作(增刪改查)

日期:2017/3/1 11:14:59   编辑:Linux編程

一.前言

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. * wu0wu
  7. *
  8. * 功能:查詢所有聯系人PROJECTION_CONTACTS信息
  9. *
  10. * */
  11. public static void _getContacts(ContentResolver cr) {
  12. Cursor cursorContact = null;
  13. try {
  14. cursorContact = cr.query(ContactsContract.Contacts.CONTENT_URI,
  15. PROJECTION_CONTACTS, Contacts.IN_VISIBLE_GROUP + "=1",
  16. null, null);
  17. Log.e("wu0wu", "聯系人個數=" + cursorContact.getCount());
  18. int[] indexs = getColumnIndexs(PROJECTION_CONTACTS, cursorContact);
  19. while (cursorContact.moveToNext()) {
  20. Log.e("wu0wu", "------------------------------------");
  21. for (int i = 0; i < PROJECTION_CONTACTS.length; i++) {
  22. String value = cursorContact.getString(indexs[i]);
  23. Log.e("wu0wu", PROJECTION_CONTACTS[i] + "=" + value);
  24. }
  25. }
  26. } catch (Exception e) {
  27. Log.e("wu0wu", e.toString());
  28. } finally {
  29. if (cursorContact != null) {
  30. cursorContact.close();
  31. }
  32. }
  33. }
  34. private static int[] getColumnIndexs(String[] projections, Cursor c) {
  35. int[] ret = new int[projections.length];
  36. for (int i = 0; i < projections.length; i++) {
  37. ret[i] = c.getColumnIndex(projections[i]);
  38. }
  39. return ret;
  40. }
3.2.2 根據contactId查詢聯系人詳細
Copyright © Linux教程網 All Rights Reserved