項目描述:該項目為基於Android平台的手機通訊錄,主要模塊分為四個部分:聯系人管理模塊,通話記錄管理模塊,短信管理模塊,系統設置模塊。
系統結構圖如下:

本項目啟動時間:2014年5月28日
說明:本次開發項目的所有源碼全部會分享給大家。開發此項目的目的有這幾點:一、鍛煉獨立開發項目的能力,二、增加對Android開發的了解,三、熟悉Android通訊錄機制。
閑話不多說,正式開始!
技術要點一:熟悉Android聯系人數據庫contacts2.db
1.獲得聯系人數據庫contacts2.db文件
步驟一、打開Eclipse並且運行模擬器;
步驟二、調出文件瀏覽器File Explorer(從工具欄中依次打開Windows—>Show View -> Other -> Android - > File Explorer),如圖所示:

步驟三、打開文件瀏覽器,並在此目錄data->data->com.android.providers.contacts->databases下,找到數據庫:contacts2.db,注意:如果是想導出真機上的contacts2.db數據庫,真機必須是經過root以后才能導出,否則在data目錄層就打不開。

步驟四、選中contacts2.db,並且在File Explorer的右上角,選擇導出鍵,將contacts2.db數據庫導入到電腦上。

步驟五、下載數據庫可視化軟件,用來幫我們打開contacts2.db,查看其中的表結構,這里我推薦使用sqlitestudio,附上下載鏈接:鏈接地址
步驟六、安裝sqlitestudio,安裝成功后,打開軟件並導入contacts2.db數據庫

步驟七、雙擊Contacts2數據庫,就能看到Contacts2.db里面所有的表
步驟九、雙擊data表,查看表的結構

步驟十、點擊工具欄上方的數據,就可以查看表中的內容

2.介紹contacts2.db數據庫
有關通訊錄的資料都放在contacts2.db中這個數據庫中,本次項目開發主要使用到的表分別如下:
contacts表
Contacts表是對raw contact表按照account type和account name進行的聚合,Contacts表的聚合邏輯在ContactAggregator.java文件中。
結構圖如下:

數據圖如下:

raw_contacts表
raw_contacts表描述了聯系人每個賬戶下的數據,根據賬戶名和賬戶類型字段進行區分。即同一個聯系人可能在raw_contact表中有多個記錄,每個記錄分屬於不同的賬戶。所以一個contact_id可能對應多個raw_contact id,為什么一個contact_id會對應多個raw_contact_id,相信讀者看到這里就會知道該問題的答案了。從這里我們也發現android是允許一個聯系人綁定多個賬戶的。
需要注意的字段為ACCOUNT_NAME,ACCOUNT_TYPE,DELETED、VERSION。
ACCOUNT_NAME和ACOUNT_TYPE我就不詳細描述了,DELETED標志位的作用是,當刪除一條用戶記錄時,可以暫時再內部維護一條刪除狀態的記錄,待該賬戶的server端刪除完畢后,再從本地刪除,其實用戶可以不必關心該字段的內部機制,只需要注意在查詢raw contact表時,可以根據DELETED字段過濾掉已刪除的記錄。VERSION字段也是一個很有用的字段,可以根據該字段來確定聯系人信息是否發生變化,如果您本地保存了聯系人信息,那么就可以根據VERSION信息來和系統數據庫的聯系人信息進行比較,來確定是否需要做UPDATE操作。
結構圖如下:

數據圖如下(兩張圖合並起來):


data表
data表存儲了聯系人的具體信息,比如電話、email等信息,從下面的圖我們可以看書每個raw contact表中的記錄會對應多個data信息,這不難理解,一個聯系人可能有多個電話號碼,多個email,這些信息是如何存儲在data表中的呢?其實不難解決這個問題,定義一個專門的描述字段用來定義該記錄的類型,即MIME TYPE,然后根據MIME TYPE來區分該記錄的類型,然后每種信息都會有一個自己的類型。
結構圖如下:

數據如下(兩張圖合並起來):


calls表
calls表主要作用是用來存放通話記錄,主要使用到這些字段date(日期),number(電話號碼),type(通話記錄類型),name(聯系人姓名)。
結構圖如下:

數據圖如下(兩張圖合並起來):


其中以上表中,contacts表,raw_contacts表,data表之間的關系如下圖所示:

這三張表是聯系人數據庫的最主要的數據表,其他的數據只是提供一些輔助功能,我們先詳細介紹這三張表的結構和使用方法。
從上圖我們可以看書contacts表和raw_contact表是一對多的關系,contacts表是對raw_contact表記錄的聚合,即contacts表中是沒有賬戶(Account)的概念的,而raw_contact表是聯系人特定賬戶的的概要信息,Data表則存儲了聯系人的詳細信息,比如email、電話號碼等。