現在有很多應用都需要讀取我們的聯系人列表,比如,微信,QQ等等。還有些專門的通訊錄應用,就可以不用官方自帶的簡陋的通訊錄,其實所有這些app全部是讀取的同一個數據庫,就是官方提供唯一的聯系人數據庫。今天就為大家來講解下這個數據庫的說明和使用。
1.首先手機添加幾個聯系人
2.然后在此路徑下可以找到db文件:/data/data/com.android.providers.contacts/databases/contact2.db
3.導出文件,將其導入可視化數據庫管理器當中(我這里用的是SQLiteExpertPersonal)
我去。。這么多表?無從下手有沒有?別著急,這里雖然表很多,其實要用的只有4張表,這里給大家標注下
下面分別對這4張表分別說明:
1、contacts表
_id:表的ID,主要用于其它表通過contacts表中的ID可以查到相應的數據。
display_name:聯系人名稱
photo_id:頭像的ID,如果沒有設置聯系人頭像,這個字段就為空
times_contacted:通話記錄的次數
last_time_contacted:最后的通話時間
lookup:是一個持久化的儲存,因為用戶可能會改名,但是它改不了lookup
該表保存了本機保存的所有聯系人,每個聯系人占一行,該表保存了聯系人的ContactID、聯系次數、最后一次聯系的時間、是否含有號碼、是否被添加到收藏夾等信息。
2、raw_contacts表
version:版本號,用于監聽變化
deleted:刪除標志,0為默認1表示這行數據已經刪除
display_name:聯系人名稱
last_time_contacts:最后聯系的時間
該表保存了所有創建過的手機聯系人,每個聯系人占一行,表里有一列標識該聯系人是否被刪除,該表保存了兩個ID:RawContactID和ContactID,從而將contacts表和raw_contacts表聯系起來。該表保存了聯系人的RawContactID、ContactID、聯系次數、最后一次聯系的時間、是否被添加到收藏夾、顯示的名字、用于排序的漢語拼音等信息。
3、mimetypes表
該表定義了所有的MimeTypeID,即聯系人的各個字段的唯一標志。
4、data表
raw_contact_id:通過raw_contact_id可以找到raw_contact表中相對的數據。
data1到data15這里保存著聯系人的信息聯系人名稱聯系人電話號碼電子郵件備注等等。
該表保存了所有創建過的手機測聯系人的所有信息,每個字段占一行,該表保存了兩個ID:MimeTypeID和RawContactID,從而將data表和raw_contacts表聯系起來。聯系人的所有信息保存在列data1至data15中,各列中保存的內容根據MimeTypeID的不同而不同。如保存號碼(MimeTypeID=5)的那行數據中,data1列保存號碼,data2列保存號碼類型(手機號碼、家庭號碼、工作號碼等)。
下面說下操作聯系人的方法
首先要是加入這兩個權限
讀取聯系人需要步驟如下:
1.先讀取contacts表,獲取ContactsID;
2.再在raw_contacts表中根據ContactsID獲取RawContactsID;
3.然后就可以在data表中根據RawContactsID獲取該聯系人的各數據了。
新建聯系人步驟如下:
1.新建聯系人時,根據contacts、raw_contacts兩張表中ID的使用情況,自動生成ContactID和RawContactID。
2.Android源碼新建重復姓名的聯系人的ContactID是不重復的,所以會重復顯示。
3.用下面的代碼新建聯系人,如果多次新建的聯系人的姓名是一樣的,生成的ContactID也會重復,RawContactID不會重復,我們在讀取聯系人的時候可以獲取所有同姓名聯系人的號碼等信息,在顯示聯系人的時候,重復姓名的聯系人的所有字段信息都會合并起來顯示為一個聯系人。
刪除聯系人:
非常簡單只需要將raw_contacts表中指定RawContactID的行刪除,其他表中與之關聯的數據都會自動刪除。
更新聯系人:
聯系人的所有信息都是保存在data表中,所以要更新聯系人,我們只需要根據RawContactID和MIMETYPE修改data表中的內容。
本文出自微信公眾號mjw-java