Android開發系列(十一):對手機通訊錄的讀取、添加、刪除、尋找

來源:互聯網
上載者:User
一、通訊錄介紹

通訊錄是Android手機內建的一個應用,它是一個ContentProvider應用,其它應用可以對通訊錄進行訪問,進行對連絡人的CRUD操作。


二、通訊錄資料庫結構的介紹

首先,我們可以在File Explorer視圖下找到contacts2.db檔案,這是通訊錄的檔案


然後,我們用SQLite開啟,分析下它的資料庫結構: raw_contacts表:


data表:


mimetypes表:


這三張表的結構介紹完了,接下來我們說下它們之間的聯絡:

raw_contacts表存放連絡人的記錄ID:欄位名稱是_id

data表存放連絡人的資訊:_id是主鍵,raw_contacts_id對應raw_contacts表的_id,mimetype_id欄位對應的是mimetypes表的_id

mimetypes表存放data表的每條記錄的屬性:_id是主鍵,為1的時候是email類型


三、顯示、添加、刪除、尋找連絡人: 1、擷取所有的連絡人:

public void testContacts() throws Exception{Uri uri = Uri.parse("content://com.android.contacts/contacts");//獲得一個ContentResolver資料共用的對象ContentResolver reslover = getContext().getContentResolver();//取得連絡人中開始的遊標,通過content://com.android.contacts/contacts這個路徑獲得Cursor cursor = reslover.query(uri, null, null, null, null);//上邊的所有代碼可以由這句話代替:Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);//Uri.parse("content://com.android.contacts/contacts") == ContactsContract.Contacts.CONTENT_URIwhile(cursor.moveToNext()){//獲得連絡人IDString id = cursor.getString(cursor.getColumnIndex(android.provider.ContactsContract.Contacts._ID));  //獲得連絡人姓名String name = cursor.getString(cursor.getColumnIndex(android.provider.ContactsContract.Contacts.DISPLAY_NAME));//獲得連絡人手機號碼Cursor phone =   reslover.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,                     ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + id, null, null);StringBuilder sb = new StringBuilder("contactid=").append(id).append(name);while(phone.moveToNext()){ //取得電話號碼(可能存在多個號碼)int phoneFieldColumnIndex = phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);String phoneNumber = phone.getString(phoneFieldColumnIndex);sb.append(phoneNumber+"www");}//建立一個Log,使得可以在LogCat視圖查看結果Log.i(TAG, sb.toString());}}
2、尋找連絡人:

//根據號碼擷取連絡人的姓名public void testContactNameByNumber() throws Exception{String number = "110";Uri uri = Uri.parse("content://com.android.contacts/data/phones/filter/"+number);ContentResolver resolver = getContext().getContentResolver();Cursor cursor = resolver.query(uri, new String[]{android.provider.ContactsContract.Data.DISPLAY_NAME}, null, null, null);if(cursor.moveToFirst()){String name = cursor.getString(0);Log.i(TAG, name);}cursor.close();}

3、新增連絡人...:

//新增連絡人...public void testAddContact() throws Exception{Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");ContentResolver resolver = getContext().getContentResolver();ContentValues values = new ContentValues();long contactid = ContentUris.parseId(resolver.insert(uri, values));uri = Uri.parse("content://com.android.contacts/data");//添加姓名values.put("raw_contact_id", contactid);values.put(Data.MIMETYPE, "vnd.android.cursor.item/name");values.put("data1", "xiaoming");resolver.insert(uri, values);values.clear();//添加電話values.put("raw_contact_id", contactid);values.put(Data.MIMETYPE, "vnd.android.cursor.item/phone_v2");values.put("data1", "1234120155");resolver.insert(uri, values);values.clear();//添加Emailvalues.put("raw_contact_id", contactid);values.put(Data.MIMETYPE, "vnd.android.cursor.item/email_v2");values.put("data1", "1234120155@qq.com");resolver.insert(uri, values);}
4、大量新增連絡人(因為如果按照姓名、電話、Email的方式添加的話,其中一個環節出錯,連絡人也可以添加上去。但是批量的話就是一下子添加所有的)

//大量新增public void testAddContact2() throws Exception{Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");ContentResolver resolver = getContext().getContentResolver();ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>();ContentProviderOperation op1 = ContentProviderOperation.newInsert(uri).withValue("account_name", null).build();operations.add(op1);uri = Uri.parse("content://com.android.contacts/data");//添加姓名ContentProviderOperation op2 = ContentProviderOperation.newInsert(uri).withValueBackReference("raw_contact_id", 0).withValue("mimetype", "vnd.android.cursor.item/name").withValue("data2", "李小龍").build();operations.add(op2);//添加電話號碼ContentProviderOperation op3 = ContentProviderOperation.newInsert(uri).withValueBackReference("raw_contact_id", 0).withValue("mimetype", "vnd.android.cursor.item/phone_v2").withValue("data1", "1234120155").withValue("data2", "2").build();operations.add(op3);resolver.applyBatch("com.android.contacts", operations);}
5、刪除連絡人:

public void testDelete()throws Exception{      String name = "李小龍";      //根據姓名求id      Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");      ContentResolver resolver = this.getContext().getContentResolver();      Cursor cursor = resolver.query(uri, new String[]{Data._ID},"display_name=?", new String[]{name}, null);      if(cursor.moveToFirst()){          int id = cursor.getInt(0);          //根據id刪除data中的相應資料          resolver.delete(uri, "display_name=?", new String[]{name});          uri = Uri.parse("content://com.android.contacts/data");          resolver.delete(uri, "raw_contact_id=?", new String[]{id+""});      }  }  






聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.