Android開發系列(十一):對手機通訊錄的讀取、新增、刪除、查詢
阿新 • • 發佈:2019-01-08
一、通訊錄介紹
通訊錄是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_URI while(cursor.moveToNext()){ //獲得聯絡人ID String 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();
//新增Email
values.put("raw_contact_id", contactid);
values.put(Data.MIMETYPE, "vnd.android.cursor.item/email_v2");
values.put("data1", "[email protected]");
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+""});
}
}