編輯:關於Android編程
聯系人數據庫學習
2011-10-31(這是android2.3上聯系人的db)
Android中聯系人的信息都是存儲在一個叫contacts2.db的數據庫中。該數據庫的路徑是:/data/data/com.android.provider.contacts/databases/contacts2.db。如圖1:
<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+ztLDx7/J0tTU2mNtZNbQzai5/WFkYsP8we6w0bjDzsS8/sCts/bAtKOovt/M5b/awe7OqqO6YWRiICBwdWxsL2RhdGEvZGF0YS9jb20uYW5kcm9pZC5wcm92aWRlci5jb250YWN0cy9kYXRhYmFzZXMvY29udGFjdHMyLmRiINKqtOa3xbXEwre+tlzX1Lao0uXD+9fWLmRio6mjrCC/ydLUyrnTw1NRTGl0ZVNwebmkvt/AtLLpv7S4w8r9vt2/4qGjyOfNvDKjujwvcD4KPHA+PGltZyBzcmM9"" alt="\">
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的不同而不同。
ContactsContact.Data
_id
行id
package_id
mimetype_id
當前行保存的mimetype類型的id。1為郵箱;2聊天賬號;3住址;4圖片;5電話號碼;6姓名;7公司+職位;8昵稱;9所屬組;10備注;11網址
raw_contact_id
raw_contacts表的_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。
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
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
聯系人顯示名稱(它可能是電子郵件地址,如果聯系人顯示名稱是不可用)
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
_id
行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網址
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
撥打電話的類型(語言電話、視頻電話)
data_id
通過data_id可以找到 data表中相對的數據。
raw_contact_id
通過raw_contact_id 可以找到 raw_contact_表中相對的數據
normalized_number
將每個電話號碼逆序排列
min_match
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)
should_sync
這組是否應該同步,是(1),否(0)
sync1到sync4
android.accounts.Account
account_name
賬戶名字
account_type
賬戶類型
android.provider.ContactsContract.Settings
account_name
賬戶名字
account_type
賬戶類型
ungrouped_versible
標志該組是否在UI中可見;“1”可見,“0”不可見
should_sync
根據同步適配器定義的模式,這個標志控制此數據源的頂級的同步行為。
ContactsContract.AggregationExceptions
_id
type
異常的類型:TYPE_KEEP_TOGETHER(1),TYPE_KEEP_SEPARATE(2)或TYPE_AUTOMATIC(3)。
raw_contact_id1
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中的自動編號列
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
ContactsContract.SyncState
_id
行id
account_name
賬戶名字
account_type
賬戶類型
data
locale
本地語言環境
照例先看效果圖自定義代碼示例public class BezierView extends View { Paint paint;//畫筆 Path path;//路徑
由於IPC機制牽扯的東西比較多,所以這裡將分為一個系列進行總結主要介紹內如如下:IPC簡介 Android中的多進程模式開啟多進程模式 多進程模式的運行機制 IPC基礎概
Android 4.4發布了一個ART運行時,准備用來替換掉之前一直使用的Dalvik虛擬機,希望籍此解決飽受诟病的性能問題。老羅不打算分析ART的實現原理,只是很有興趣
實現原理(1)首先獲得下載文件的長度,然後設置本地文件的長度。(2)根據文件長度和線程數計算每條線程下載的數據長度和下載位置。如:文件的長度為6M,線程數為3,那麼,每條