一、前言:
最近任務暫時做完了,有一,兩天空閑時間,因此,就想把Android Contact這塊梳理下,也方便以後自己。
Android Contact的所有資料庫表,都存在contacts2.db(路徑: /data/data/com.android.providers.contacts/databases/contacts2.db)中,之所以叫contact2,是因為,它是從Android 2.0(API Level5)開始,對這塊的API有了改進,以適應一個連絡人有多個帳戶的需求(如手機通訊錄與GMAIL通訊錄),連絡人資料庫是基於關係型的,它們之間的關係如下:
二、表Data
Data表格儲存體了連絡人的詳細資料,表中的每一行儲存一個特定類型的資訊,比如Email、Address或Phone等,每一行通過一個mimetype_id的欄位來表示該行儲存的是什麼類型的資料,該欄位引用了mimetyps表,此表格儲存體了常用的資料類型。
表Data的資料欄位:
各欄位講解:
mimetype_id
表示該行儲存的資訊的類型
raw_contact_id
表示該行所屬的RawContact
is_primary
該欄位表示此data是否是其所屬的raw contact的主data,即其display name會作為raw contact的display name
is_super_primary
該data是否是其所屬的contact的主data,如果is_super_primary為1則is_primary一定為1
data1 - data15
資料欄位,由mimetype_id來決定,一般data1表是主資訊(如電話,Email地址等),data2表示副資訊,data15表示Blob資料(binary data),如:
類型是Phone.CONTENT_ITEM_TYPE,則data1存的就是phone number;
類型是 Email.CONTENT_ITEM_TYPE,則data1存的就是email address等。
data_sync1~data_sync4
sync_adapter要用的欄位,sync_adapter用於資料的同步,比如你手機中的Gmail帳戶與Google伺服器的同步。
data_version
資料的版本,用於資料的同步。
三、表RawContact
RawContact表每行為每個使用者儲存了聯絡資訊,當插入一個raw contact或當一個raw contact所屬的一個data改變時,系統會檢查這個raw contact跟其他的raw contact是否可以匹配(比如,如果兩個raw contact的data包含相同的電話號碼或名字),如果匹配他們就會被綜合到一起,也就是說他們會屬於同一個cantact,表現為在RawContact表中他們引用的cantact_id是一樣的。
表RawContact資料欄位
四、表Contact
Contact表不能被主動建立,Contact表中的一行表示一個連絡人,它是RawContact表中的一行或多行的資料的組合,這些RawContact表中的行表示同一個人的不同的帳戶資訊。Contact中的資料由系統組合RawContact表中的資料自動產生,不可以直接向這個表中插入資料,當一個raw contact被插入的時候,系統會首先尋找Contact表看是否有記錄跟插入的raw contact表示同一個人,如果找到了,則把找到的這個contact的_ID插入raw contact記錄的CONTACT_ID欄位,如果沒有找到,則系統自動插入一個Contact記錄並把它的_ID插入新插入的raw contact的CONTACT_ID列。
更新操作:
Contact表中只有TIMES_CONTACTED、LAST_TIME_CONTACTED、STARRED、CUSTOM_RINGTONE、SENE_TO_VOICEMAIL列可更改,這些列的更改會導致相應的raw contact被更改。
刪除操作:
當刪除Contact表中的記錄時,會刪除一個連絡人的所有帳戶的資訊,也就是說,其對應的所有raw contacts也會被刪除,各raw contact對應的data也就被刪除了,sync adapter同步時也會刪除伺服器端的相應記錄。
查詢操作:
如果需要尋找一個連絡人的資訊用CONTENT_LOOKUP_URI代替CONTENT_URI(見後面);
如果需要通過電話號碼尋找一個連絡人,用PhoneLookup.CONTENT_FIILTER_URI,這個URI為這個目的進行了最佳化;
如果需要通過部分名字的匹配尋找,用CONTENT_FILTER_URI;
如果需要通過email,address等資訊尋找,尋找表ContactsContract.Data,結果包含contact ID,名字等。
五、小結
這篇文章只是講了這三張表之間的關係,以及各自的欄位,是一些原理性的東西,除了這三張表,在實際操作中,還涉及到其它類的參與,比如ContactsContract.Data, ContactsContract.CommonDataKinds, ContactsContract.PhoneLookup等,下篇文章,將會給出一些例子,來對原理有更深的瞭解。