歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android操作聯系人

Android系統中的聯系人也是通過ContentProvider來對外提供數據的,我們這裡實現獲取所有聯系人、通過電話號碼獲取聯系人、添加聯系人、使用事務添加聯系人。

獲取所有聯系人

1.   Android系統中的聯系人也是通過ContentProvider來對外提供數據的

2.   數據庫路徑為:/data/data/com.android.providers.contacts/database/contacts2.db

3.   我們需要關注的有3張表

     raw_contacts:其中保存了聯系人id

     data:和raw_contacts是多對一的關系,保存了聯系人的各項數據

     mimetypes:為數據類型

4.   Provider的authorites為com.android.contacts

5.   查詢raw_contacts表的路徑為:contacts

6.   查詢data表的路徑為:contacts/#/data

     這個路徑為連接查詢,要查詢“mimetype”字段可以根據“mimetype_id”查詢到mimetypes表中的數據

7.   先查詢raw_contacts得到每個聯系人的id,在使用id從data表中查詢對應數據,根據mimetype分類數據

示例:

  1.          //查詢所有聯系人  
  2. public void testGetAll() {  
  3.     ContentResolver resolver = getContext().getContentResolver();  
  4.     Uri uri = Uri.parse("content://com.android.contacts/contacts");  
  5.     Cursor idCursor = resolver.query(uri, new String[] { "_id" }, null, null, null);  
  6.     while (idCursor.moveToNext()) {  
  7.         //獲取到raw_contacts表中的id  
  8.         int id = idCursor.getInt(0);   
  9.         //根據獲取到的ID查詢data表中的數據  
  10.         uri = Uri.parse("content://com.android.contacts/contacts/" + id + "/data");  
  11.         Cursor dataCursor = resolver.query(uri, new String[] { "data1", "mimetype" }, null, null, null);  
  12.         StringBuilder sb = new StringBuilder();  
  13.         sb.append("id=" + id);  
  14.         //查詢聯系人表中的  
  15.         while (dataCursor.moveToNext()) {  
  16.             String data = dataCursor.getString(0);  
  17.             String type = dataCursor.getString(1);  
  18.             if ("vnd.android.cursor.item/name".equals(type))  
  19.                 sb.append(", name=" + data);  
  20.             else if ("vnd.android.cursor.item/phone_v2".equals(type))  
  21.                 sb.append(", phone=" + data);  
  22.             else if ("vnd.android.cursor.item/email_v2".equals(type))  
  23.                 sb.append(", email=" + data);  
  24.         }  
  25.         System.out.println(sb);  
  26.     }  
  27. }  

通過電話號碼獲取聯系人

1.   系統內部提供了根據電話號碼獲取data表數據的功能,路徑為:data/phones/filter/*

2.   用電話號碼替換“*”部分就可以查到所需數據,獲取“display_name”可以獲取到聯系人顯示名

示例:

  1.         //根據電話號碼查詢聯系人名稱  
  2. public void testGetName() {  
  3.     ContentResolver resolver = getContext().getContentResolver();  
  4.     Uri uri = Uri.parse("content://com.android.contacts/data/phones/filter/1111");  
  5.     Cursor c = resolver.query(uri, new String[] { "display_name" }, null, null, null);  
  6.     while (c.moveToNext()) {  
  7.         System.out.println(c.getString(0));  
  8.     }  
  9. }  

添加聯系人

1.   先向raw_contacts表插入id,路徑為:raw_contacts

2.   得到id之後再向data表插入數據,路徑為:data

示例:

  1.        //添加聯系人  
  2. ublic void testInsert() {  
  3. ContentResolver resolver = getContext().getContentResolver();  
  4. Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");  
  5. ContentValues values = new ContentValues();  
  6. // 向raw_contacts插入一條除了ID之外, 其他全部為NULL的記錄, ID是自動生成的  
  7. long id = ContentUris.parseId(resolver.insert(uri, values));   
  8. //添加聯系人姓名  
  9. uri = Uri.parse("content://com.android.contacts/data");  
  10. values.put("raw_contact_id", id);  
  11. values.put("data2", "FHM");  
  12. values.put("mimetype", "vnd.android.cursor.item/name");  
  13. resolver.insert(uri, values);  
  14.                 //添加聯系人電話  
  15. values.clear(); // 清空上次的數據  
  16. values.put("raw_contact_id", id);  
  17. values.put("data1", "18600000000");  
  18. values.put("data2", "2");  
  19. values.put("mimetype", "vnd.android.cursor.item/phone_v2");  
  20. resolver.insert(uri, values);  
  21. //添加聯系人郵箱  
  22. values.clear();  
  23. values.put("raw_contact_id", id);  
  24. values.put("data1", "[email protected]");  
  25. values.put("data2", "1");  
  26. values.put("mimetype", "vnd.android.cursor.item/email_v2");  
  27. resolver.insert(uri, values);  

使用事務添加聯系人

1.   在添加聯系人得時候是分多次訪問Provider,如果在過程中出現異常,會出現數據不完整的情況,這些操作應該放在一次事務中

2.   使用ContentResolver的applyBatch(String authority,ArrayList<ContentProviderOperation> operations) 方法可以將多個操作在一個事務中執行

3.   文檔位置:

file:///F:/android-sdk-windows/docs/reference/android/provider/ContactsContract.RawContacts.html

示例:

  1.         //使用事務添加聯系人  
  2. public void testInsertBatch() throws Exception {  
  3.     ContentResolver resolver = getContext().getContentResolver();  
  4.   
  5.     ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>();  
  6.   
  7.     ContentProviderOperation operation1 = ContentProviderOperation //  
  8.             .newInsert(Uri.parse("content://com.android.contacts/raw_contacts")) //  
  9.             .withValue("_id", null) //  
  10.             .build();  
  11.     operations.add(operation1);  
  12.   
  13.     ContentProviderOperation operation2 = ContentProviderOperation //  
  14.             .newInsert(Uri.parse("content://com.android.contacts/data")) //  
  15.             .withValueBackReference("raw_contact_id", 0) //  
  16.             .withValue("data2", "ZZH") //  
  17.             .withValue("mimetype", "vnd.android.cursor.item/name") //  
  18.             .build();  
  19.     operations.add(operation2);  
  20.       
  21.     ContentProviderOperation operation3 = ContentProviderOperation //  
  22.             .newInsert(Uri.parse("content://com.android.contacts/data")) //  
  23.             .withValueBackReference("raw_contact_id", 0) //  
  24.             .withValue("data1", "18612312312") //  
  25.             .withValue("data2", "2") //  
  26.             .withValue("mimetype", "vnd.android.cursor.item/phone_v2") //  
  27.             .build();  
  28.     operations.add(operation3);  
  29.   
  30.     ContentProviderOperation operation4 = ContentProviderOperation //  
  31.             .newInsert(Uri.parse("content://com.android.contacts/data")) //  
  32.             .withValueBackReference("raw_contact_id", 0) //  
  33.             .withValue("data1", "[email protected]") //  
  34.             .withValue("data2", "2") //  
  35.             .withValue("mimetype", "vnd.android.cursor.item/email_v2") //  
  36.             .build();  
  37.     operations.add(operation4);  
  38.   
  39.     // 在事務中對多個操作批量執行  
  40.     resolver.applyBatch("com.android.contacts", operations);  
  41. }  
Copyright © Linux教程網 All Rights Reserved