現(xiàn)在有很多應(yīng)用都需要讀取我們的聯(lián)系人列表涂佃,比如,微信蜈敢,QQ等等辜荠。還有些專門的通訊錄應(yīng)用,就可以不用官方自帶的簡陋的通訊錄抓狭,其實(shí)所有這些app全部是讀取的同一個(gè)數(shù)據(jù)庫侨拦,就是官方提供唯一的聯(lián)系人數(shù)據(jù)庫。今天就為大家來講解下這個(gè)數(shù)據(jù)庫的說明和使用辐宾。
1.首先手機(jī)添加幾個(gè)聯(lián)系人
2.然后在此路徑下可以找到db文件:/data/data/com.android.providers.contacts/databases/contact2.db
3.導(dǎo)出文件狱从,將其導(dǎo)入可視化數(shù)據(jù)庫管理器當(dāng)中(我這里用的是SQLiteExpertPersonal)
我去。叠纹。這么多表季研?無從下手有沒有?別著急誉察,這里雖然表很多与涡,其實(shí)要用的只有4張表,這里給大家標(biāo)注下
下面分別對這4張表分別說明:
1持偏、contacts表
_id:表的ID驼卖,主要用于其它表通過contacts表中的ID可以查到相應(yīng)的數(shù)據(jù)。
display_name:聯(lián)系人名稱
photo_id:頭像的ID鸿秆,如果沒有設(shè)置聯(lián)系人頭像酌畜,這個(gè)字段就為空
times_contacted:通話記錄的次數(shù)
last_time_contacted:最后的通話時(shí)間
lookup:是一個(gè)持久化的儲(chǔ)存,因?yàn)橛脩艨赡軙?huì)改名卿叽,但是它改不了lookup
該表保存了本機(jī)保存的所有聯(lián)系人桥胞,每個(gè)聯(lián)系人占一行,該表保存了聯(lián)系人的ContactID考婴、聯(lián)系次數(shù)贩虾、最后一次聯(lián)系的時(shí)間、是否含有號(hào)碼沥阱、是否被添加到收藏夾等信息缎罢。
2、raw_contacts表
version:版本號(hào),用于監(jiān)聽變化
deleted:刪除標(biāo)志策精,0為默認(rèn)1表示這行數(shù)據(jù)已經(jīng)刪除
display_name:聯(lián)系人名稱
last_time_contacts:最后聯(lián)系的時(shí)間
該表保存了所有創(chuàng)建過的手機(jī)聯(lián)系人舰始,每個(gè)聯(lián)系人占一行,表里有一列標(biāo)識(shí)該聯(lián)系人是否被刪除蛮寂,該表保存了兩個(gè)ID:RawContactID和ContactID,從而將contacts表和raw_contacts表聯(lián)系起來蔽午。該表保存了聯(lián)系人的RawContactID、ContactID酬蹋、聯(lián)系次數(shù)及老、最后一次聯(lián)系的時(shí)間、是否被添加到收藏夾范抓、顯示的名字骄恶、用于排序的漢語拼音等信息。
3匕垫、mimetypes表
該表定義了所有的MimeTypeID僧鲁,即聯(lián)系人的各個(gè)字段的唯一標(biāo)志。
4象泵、data表
raw_contact_id:通過raw_contact_id可以找到raw_contact表中相對的數(shù)據(jù)寞秃。
data1到data15這里保存著聯(lián)系人的信息聯(lián)系人名稱聯(lián)系人電話號(hào)碼電子郵件備注等等。
該表保存了所有創(chuàng)建過的手機(jī)測聯(lián)系人的所有信息偶惠,每個(gè)字段占一行春寿,該表保存了兩個(gè)ID:MimeTypeID和RawContactID,從而將data表和raw_contacts表聯(lián)系起來。聯(lián)系人的所有信息保存在列data1至data15中忽孽,各列中保存的內(nèi)容根據(jù)MimeTypeID的不同而不同绑改。如保存號(hào)碼(MimeTypeID=5)的那行數(shù)據(jù)中,data1列保存號(hào)碼兄一,data2列保存號(hào)碼類型(手機(jī)號(hào)碼厘线、家庭號(hào)碼、工作號(hào)碼等)出革。
下面說下操作聯(lián)系人的方法
首先要是加入這兩個(gè)權(quán)限
讀取聯(lián)系人需要步驟如下:
1.先讀取contacts表造壮,獲取ContactsID;
2.再在raw_contacts表中根據(jù)ContactsID獲取RawContactsID蹋盆;
3.然后就可以在data表中根據(jù)RawContactsID獲取該聯(lián)系人的各數(shù)據(jù)了费薄。
新建聯(lián)系人步驟如下:
1.新建聯(lián)系人時(shí),根據(jù)contacts栖雾、raw_contacts兩張表中ID的使用情況,自動(dòng)生成ContactID和RawContactID伟众。
2.Android源碼新建重復(fù)姓名的聯(lián)系人的ContactID是不重復(fù)的析藕,所以會(huì)重復(fù)顯示。
3.用下面的代碼新建聯(lián)系人凳厢,如果多次新建的聯(lián)系人的姓名是一樣的账胧,生成的ContactID也會(huì)重復(fù)竞慢,RawContactID不會(huì)重復(fù),我們在讀取聯(lián)系人的時(shí)候可以獲取所有同姓名聯(lián)系人的號(hào)碼等信息治泥,在顯示聯(lián)系人的時(shí)候筹煮,重復(fù)姓名的聯(lián)系人的所有字段信息都會(huì)合并起來顯示為一個(gè)聯(lián)系人。
刪除聯(lián)系人:
非常簡單只需要將raw_contacts表中指定RawContactID的行刪除居夹,其他表中與之關(guān)聯(lián)的數(shù)據(jù)都會(huì)自動(dòng)刪除败潦。
更新聯(lián)系人:
聯(lián)系人的所有信息都是保存在data表中,所以要更新聯(lián)系人准脂,我們只需要根據(jù)RawContactID和MIMETYPE修改data表中的內(nèi)容劫扒。
本文出自微信公眾號(hào)mjw-java