聯繫人數據庫學習
2011-10-31(這是android2.3上聯繫人的db)
簡介
Android中聯繫人的信息都是存儲在一個叫contacts2.db的數據庫中。該數據庫的路徑是:/data/data/com.android.provider.contacts/databases/contacts2.db。如圖1:
我們可以在cmd中通過adb命令把該文件拉出來(具體口令爲:adb pull/data/data/com.android.provider.contacts/databases/contacts2.db 要存放的路徑\自定義名字.db), 可以使用SQLiteSpy工具來查看該數據庫。如圖2:
ContactsContract.java這個類就是去解釋和翻譯這個contacts2.db數據庫的。所有的聯繫人Uri,與聯繫人相關數據庫字段均在此定義。這個類中有很多的內部接口和內部類,用來翻譯一些表,例如Data內部類,RawContacts內部類等。
通信錄是一個3層的數據存儲模型,這三個數據模型就是ContactsContact.Data,ContactsContact.RawContacts,ContactsContact.Contacts。對應三個表:data、raw_contacts、contacts。
1) contacts表
表保存了所有的手機測聯繫人,每個聯繫人佔一行,該表保存了聯繫人的ContactID、聯繫次數、最後一次聯繫的時間、是否含有號碼、是否被添加到收藏夾等信息。contacts是由raw contacts經過整合而來的,一個contacts可以由一個或多個raw contacts組合而成。
2、raw_contacts表
表保存了所有創建過的手機聯繫人,每個聯繫人佔一行,表裏有一列標識該聯繫人是否被刪除,該表保存了兩個ID: RawContactID和ContactID,從而將contacts表和raw_contacts表聯繫起來。該表保存了聯繫人的RawContactID 、ContactID、聯繫次數、最後一次聯繫的時間、是否被添加到收藏夾、顯示的名字、用於排序的漢語拼音等信息。
3、data表
表保存了所有創建過的手機聯繫人的所有信息,每個字段佔一行,該表保存了兩個ID: MimeTypeID和RawContactID,從而將data表和raw_contacts表聯繫起來。聯繫人的所有信息保存在列data1至data15中,各列中保存的內容根據MimeTypeID的不同而不同。
聯繫人數據庫contact2.db中的表
data表
ContactsContact.Data
行id |
|
package_id |
|
當前行保存的mimetype類型的id。1爲郵箱;2聊天賬號;3住址;4圖片;5電話號碼;6姓名;7公司+職位;8暱稱;9所屬組;10備註;11網址 |
|
raw_contact_id |
|
is_primary |
是否是它屬於的raw_contacts的primary entry,“1”true,“0”false |
is_super_primary |
|
data_version |
數據記錄的版本。每當數據行更改版本上升。這個值是單調遞增的。 |
data1 到data15 |
通用數據列(保存着聯繫人的信息,聯繫人名稱、聯繫人電話號碼、電子郵件、備註等)。各列的含義是由mimetype_id的類型確定的。data15用於存儲的BLOB(二進制數據)(存儲圖片)。 |
data_sync1 到 data_sync4 |
同步適配器使用的通用列。例如,照片行可以存儲圖像的URL在SYNC1,狀態(不加載,加載,加載錯誤)在SYNC2,服務器端的版本號在SYNC3和錯誤代碼在SYNC4。 |
contacts表
ContactsContact.Contacts
_id |
行id,建議用LOOKUP_KEY代替 |
name_raw_contact_id |
raw_contacts表的_id |
photo_id |
是否含有圖片。引用data表的 _id,在data_id含有相應的mime_type_id, 根據mime_type_id的CONTENT_ITEM_TYPE 查圖片 |
custom_ringtone |
與聯繫人相關的鈴聲 |
send_to_voicemail |
指示器,判斷是否來自此聯繫人的電話是否發送到語音信箱(1)或(0)。當是多個raw_contacts聚合時,這一領域的自動計算:如果所有聚合的raw_contacts 都設置SEND_TO_VOICEMAIL=1,那麼這個字段設置爲'1'。設置此字段,會自動更改所有聚合的raw_contacts的相應的字段。 |
times_contacted |
與該聯繫人聯繫的次數 |
last_time_contacted |
上次聯繫的時間 |
statrred |
是否是常用聯繫人;是(1),否(0) |
in_visible_group |
這個聯繫人在UI中是否可見; 是(1),否(0) |
has_phone_number |
該聯繫人否至少有一個手機號碼; 是(1),否(0) |
lookup |
一個不透明的值(是一個持久化的儲存),提示如何找到特定聯繫的值(如果因同步或聚集而改變其行ID的值) |
status_update_id |
|
single_is_restricted |
|
raw_contacts表
ContactsContract.RawContacts
_id |
行id 。同步適配器應儘量在更新過程中的維護行ID。換句話說,同步適配器更新的一個raw_contact,而不是刪除並重新插入會是更好的。 |
is_restricted |
|
account_name |
指明該聯繫人是從哪個賬戶上同步下載下來的。 |
account_type |
帳戶的類型 |
source_id |
此行賬戶的類型的獨特的標示。通常它在raw contact是插入時建立,事後從未改變。一個值得注意的例外是一個新的raw contact:將有一個帳戶名和類型,但沒有source id。這表明同步適配器需要創建一個新的聯繫人的在服務器端和把它的ID存儲在手機上相應的SOURCE_ID字段。 |
version |
版本;當列或相關數據修改時,將會自動修改 |
dirty |
版本發生改變的標記; (此行需要將其擁有的帳戶同步,當raw contact發生改變時,自動設爲1(除 URI has the CALLER_IS_SYNCADAPTER外)。同步適配器應始終提供查詢參數,以防止不必要的同步:用戶改變服務器上的一些數據,同步適配器更新手機上的聯繫人(無CALLER_IS_SYNCADAPTER標誌)標誌,當設置dirty標誌,從而觸發同步,同步變化到服務器) |
delete |
刪除標記;0 or 1;1 表示標記爲被刪除。 |
contact_id |
contacts 表中的_id。通過聚合的過程raw contacts 被鏈接到contact,它被AGGREGATION_MODE字段和ContactsContract.AggregationExceptions控制。 |
aggregation_mode |
聚合模式。值爲AGGREGATION_MODE_DEFAULT, AGGREGATION_MODE_DISABLED 或AGGREGATION_MODE_SUSPENDED. |
aggregation_needed |
0或者1 |
custom_rington |
與該記錄相關的手機鈴聲 |
send_to_voicemail |
指示器,判斷來自此聯繫人的電話是否發送到語音信箱(1)或(0)。當是多個raw_contacts聚合時,這一領域的自動計算:如果所有聚合的raw_contacts 都設置SEND_TO_VOICEMAIL=1,那麼這個字段設置爲'1'。設置此字段,會自動更改所有聚合的raw_contacts的相應的字段。 |
times_contacted |
與該聯繫人聯繫的次數 |
last_time_contacted |
上次聯繫的時間 |
statrred |
是否是常用聯繫人;是(1),否(0) |
聯繫人顯示名稱(它可能是電子郵件地址,如果聯繫人顯示名稱是不可用) |
|
display_name_alt |
聯繫人顯示名稱的替代表示,如西方名字“名在前”而不是 “姓在前”。 |
display_name_source |
作爲聯繫人的顯示名稱使用的數據類型,如結構化姓名或電子郵件地址。 |
phonetic_name |
|
phonetic_name_style |
|
soft_key |
排序的關鍵,考慮賬戶中語言環境,按地址簿中的顯示名稱進行排序。對應display_name (姓名拆分加拼音:如“墨跡”,則爲“MO墨JI跡”)。 |
soft_key_alt |
排序鍵,基於全名的拼音,對應display_name_alt(姓名拆分加拼音:如“墨跡”,則爲“MO墨JI跡”) |
name_verified |
|
contact_in_visible_group |
這個聯繫人在UI中是否可見; 是(1),否(0) |
sync1 到sync4 |
|
mimetypes表
行id ,與data表中的mimetype_id對應 |
|
mimetype |
如下 |
_id mimetype
1 vnd.android.cursor.item/email_v2
2 vnd.android.cursor.item/im
3 vnd.android.cursor.item/postal-address_v2
4 vnd.android.cursor.item/photo
5 vnd.android.cursor.item/phone_v2
6 vnd.android.cursor.item/name
7 vnd.android.cursor.item/organization
8 vnd.android.cursor.item/nickname
9 vnd.android.cursor.item/group_membership
10 vnd.android.cursor.item/note
11 vnd.android.cursor.item/website
12 vnd.android.cursor.item/relation
13 vnd.android.cursor.item/contact_event
1爲郵箱;2聊天賬號;3住址;4圖片;5電話號碼;6姓名;7公司+職位;8暱稱;9所屬組;10備註;11網址
calls表
android.provider.CallLog.Calls
_id |
行id , |
number |
通話電話號碼 |
data |
撥打該電話號碼的開始時間(以1970-01-01 00:00:00)計算到當前的時間差以毫秒爲單位 |
duration |
打電話持續時間,以秒爲單位 |
type |
呼叫類型(“1”來電,“2”外撥,“3”未接) |
new |
呼叫已被確認與否。“1”代表來電,外撥,“0”代表未接 |
name |
如果聯繫人存在,與電話號碼相關聯的聯繫人的名字 |
numbertype |
如果聯繫人存在,與電話號碼相關聯的電話類型 |
numberlabel |
如果聯繫人存在,自定義數字類型相關聯的電話號碼數字標籤(例如VOICE)(numbertype 爲1-7時numberlabel爲null;爲0時顯示自定義標籤) |
typedial |
撥打電話的類型(語言電話、視頻電話) |
phone_lookup表
通過data_id可以找到 data表中相對的數據。 |
|
raw_contact_id |
通過raw_contact_id 可以找到 raw_contact_表中相對的數據 |
normalized_number |
將每個電話號碼逆序排列 |
min_match |
|
groups表
ContactsContract.Groups
_id |
行id |
package_id |
|
account_name |
賬戶名字 |
account_type |
帳戶的類型 |
sourceid |
|
version |
版本;當列或相關數據修改時,將會自動修改 |
dirty |
版本發生改變的標記 |
title |
這組顯示的標題 |
title_res |
|
notes |
這組的註釋 |
system_id |
如果它是一個系統組,這個組的ID,即對同步適配器具有特殊意義的一組,否則返回null。 |
deleted |
刪除標記;0 or 1;1 表示標記爲被刪除。 |
group_visible |
羣組是否在UI中 是否可見;是(1),否(0) |
這組是否應該同步,是(1),否(0) |
|
sync1到sync4 |
|
accounts表
android.accounts.Account
account_name |
賬戶名字 |
account_type |
賬戶類型 |
settings表
android.provider.ContactsContract.Settings
account_name |
賬戶名字 |
account_type |
賬戶類型 |
標誌該組是否在UI中可見;“1”可見,“0”不可見 |
|
should_sync |
根據同步適配器定義的模式,這個標誌控制此數據源的頂級的同步行爲。 |
agg_exceptions表
ContactsContract.AggregationExceptions
_id |
|
異常的類型:TYPE_KEEP_TOGETHER(1),TYPE_KEEP_SEPARATE(2)或TYPE_AUTOMATIC(3)。 |
|
A reference to the _ID of the raw contact that the rule applies to. |
|
raw_contact_id1 |
A reference to the other _ID of the raw contact that the rule applies to. |
raw_contact_id1和raw_contact_id2之間通過規則(type)引用
sqlite_sequence表
SQLite中的自動編號列
name |
自動編號字段所在的表 |
seq |
當前用到的序號 |
calls 的seq爲7 說明我們的通話記錄有7個。
在開發過程中,我們經常要把表重置。也就是說把表中的記錄全部清空,並把自動編號歸0。在SQLite中,只需要修改 sqlite_sequence 表就可以了:
UPDATEsqlite_sequence SET seq = 0 WHERE name = 'TableName'
也可以直接把該記錄刪掉:
DELETEFROM sqlite_sequence WHERE name = 'TableName'
要是想重置所有表,那直接把 sqlite_sequence 清空就可以了:
DELETEFROM sqlite_sequence
_sync_state表
ContactsContract.SyncState
_id |
行id |
account_name |
賬戶名字 |
account_type |
賬戶類型 |
data |
|
android_metadata
locale |
本地語言環境 |