android從零單排之手機通訊錄的讀取、新增、刪除、查詢
工作中牽扯到了對android手機通訊錄的系列操作,網上查找了好多資料,大多數都介紹的是模模糊糊,終於找到了一篇靠譜的,於是摘抄下來,大家共同學習:</span>
Android聯絡人資料庫檔案(contact2.db)
有研究過手機通訊錄資料的童鞋肯定知道一個數據庫檔案:目前是contact2.db(哥的手機是Android4.04的)
在此路徑下可以找到:/data/data/com.android.providers.contacts/databases/contact2.db
將其匯入視覺化資料庫管理器當中(我這裡用的是SQLiteDatabase Browser)
有以上那麼多張表,看到頭暈的有木有,我們主要關注一些比較重要的表就行了。
以上我用紅框標誌的是比較重要的幾個表:
1、contacts表
該表儲存了所有的手機測聯絡人,每個聯絡人佔一行,該表儲存了聯絡人的ContactID、聯絡次數、最後一次聯絡的時間、是否含有號碼、是否被新增到收藏夾等資訊。
2、raw_contacts表
該表儲存了所有建立過的手機測聯絡人,每個聯絡人佔一行,表裡有一列標識該聯絡人是否被刪除,該表儲存了兩個ID: RawContactID和ContactID,從而將contacts表和raw_contacts表聯絡起來。該表儲存了聯絡人的RawContactID、ContactID、聯絡次數、最後一次聯絡的時間、是否被新增到收藏夾、顯示的名字、用於排序的漢語拼音等資訊。
3、 mimetypes 表
該表定義了所有的MimeTypeID,即聯絡人的各個欄位的唯一標誌。
4、data表
? 該表儲存了所有建立過的手機測聯絡人的所有資訊,每個欄位佔一行 ,該表儲存了兩個ID: MimeTypeID和RawContactID,從而將data表和raw_contacts表聯絡起來。
? 聯絡人的所有資訊儲存在列data1至data15中,各列中儲存的內容根據MimeTypeID的不同而不同。如儲存號碼(MimeTypeID=5)的那行資料中,data1列儲存號碼,data2列儲存號碼型別(手機號碼/家庭號碼/工作號碼等)。
對聯絡人的基本操作(增刪改查)
許可權設定
讀取聯絡人
分為以下步驟:
1、先讀取contacts表,獲取ContactsID;
2、再在raw_contacts表中根據ContactsID獲取RawContactsID;
3、然後就可以在data表中根據RawContactsID獲取該聯絡人的各資料了。
private void queryContacts() {
// 獲取用來操作資料的類的物件,對聯絡人的基本操作都是使用這個物件
ContentResolver cr = getContentResolver();
// 查詢contacts表的所有記錄
Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null,
null, null, null);
// 如果記錄不為空
if (cursor.getCount() > 0) {
// 遊標初始指向查詢結果的第一條記錄的上方,執行moveToNext函式會判斷
// 下一條記錄是否存在,如果存在,指向下一條記錄。否則,返回false。
while (cursor.moveToNext()) {
String rawContactId = "";
// 從Contacts表當中取得ContactId
String id = cursor.getString(cursor
.getColumnIndex(ContactsContract.Contacts._ID));
Log.v("contactID", id);
// 獲取RawContacts表的遊標
Cursor rawContactCur = cr.query(RawContacts.CONTENT_URI, null,
RawContacts._ID + "=?", new String[] { id }, null);
// 該查詢結果一般只返回一條記錄,所以我們直接讓遊標指向第一條記錄
if (rawContactCur.moveToFirst()) {
// 讀取第一條記錄的RawContacts._ID列的值
rawContactId = rawContactCur.getString(rawContactCur
.getColumnIndex(RawContacts._ID));
Log.v("rawContactID", rawContactId);
}
// 關閉遊標
rawContactCur.close();
// 讀取號碼
if (Integer
.parseInt(cursor.getString(cursor
.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
// 根據查詢RAW_CONTACT_ID查詢該聯絡人的號碼
Cursor phoneCur = cr
.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.RAW_CONTACT_ID
+ "=?",
new String[] { rawContactId }, null);
// 上面的ContactsContract.CommonDataKinds.Phone.CONTENT_URI
// 可以用下面的phoneUri代替
// Uri
// phoneUri=Uri.parse("content://com.android.contacts/data/phones");
// 一個聯絡人可能有多個號碼,需要遍歷
while (phoneCur.moveToNext()) {
// 獲取號碼
String number = phoneCur
.getString(phoneCur
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
Log.v("number", number);
// 獲取號碼型別
String type = phoneCur
.getString(phoneCur
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
Log.v("type", type);
}
phoneCur.close();
}
}
cursor.close();
}
}
新建聯絡人
新建聯絡人時, 根據contacts、raw_ contacts兩張表中ID的使用情況,自動生成ContactID和RawContactID。
Android原始碼新建重複姓名的聯絡人的ContactID是不重複的,所以會重複顯示。
用下面的程式碼新建聯絡人,如果多次新建的聯絡人的姓名是一樣的,生成的ContactID也會重複, RawContactID不會重複,我們在讀取聯絡人的時候可以獲取所有同姓名聯絡人的號碼等資訊,在顯示聯絡人的時候,重複姓名的聯絡人的所有欄位資訊都會合並起來顯示為一個聯絡人。
public void addContact(String name, String phoneNum) {
ContentValues values = new ContentValues();
Uri rawContactUri = getContentResolver().insert(
RawContacts.CONTENT_URI, values);
long rawContactId = ContentUris.parseId(rawContactUri);
// 向data表插入資料
if (name != "") {
values.clear();
values.put(Data.RAW_CONTACT_ID, rawContactId);
values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
values.put(StructuredName.GIVEN_NAME, name);
getContentResolver().insert(ContactsContract.Data.CONTENT_URI,
values);
}
// 向data表插入電話號碼
if (phoneNum != "") {
values.clear();
values.put(Data.RAW_CONTACT_ID, rawContactId);
values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
values.put(Phone.NUMBER, phoneNum);
values.put(Phone.TYPE, Phone.TYPE_MOBILE);
getContentResolver().insert(ContactsContract.Data.CONTENT_URI,
values);
}
}
刪除聯絡人
Android幫助文件:When a raw contact is deleted, all of its Data rows as well asStatusUpdates, AggregationExceptions, PhoneLookup rows are deleted automatically.
所以,要刪除聯絡人,我們只需要將raw_contacts表中指定RawContactID的行刪除,其他表中與之關聯的資料都會自動刪除。
// 刪除聯絡人
public void deleteContact(long rawContactId) {
getContentResolver().delete(
ContentUris.withAppendedId(RawContacts.CONTENT_URI,
rawContactId), null, null);
}
更新聯絡人
聯絡人的所有資訊都是儲存在data表中,所以要更新聯絡人,我們只需要根據RawContactID和MIMETYPE修改data表中的內容。
// 更新聯絡人
public void updataCotact(long rawContactId) {
ContentValues values = new ContentValues();
values.put(Phone.NUMBER, "13800138000");
values.put(Phone.TYPE, Phone.TYPE_MOBILE);
String where = ContactsContract.Data.RAW_CONTACT_ID + "=? AND "
+ ContactsContract.Data.MIMETYPE + "=?";
String[] selectionArgs = new String[] { String.valueOf(rawContactId),
Phone.CONTENT_ITEM_TYPE };
getContentResolver().update(ContactsContract.Data.CONTENT_URI, values,
where, selectionArgs);
}
以上就是本篇部落格的所有內容,不知道小巫說清楚了沒有?關於Android相關的知識點,還是需要多查資料和總結才能比較熟悉,檢視官方文件是最直接的方式,如果閱讀全英文有困難的話就看看別人總結的東西吧。