先看数据库中各个表之间的关系图:
各表中的字段详细:
1、 contacts表
该表存储了现有的contacts联系人(在Contacts Filter 中可以通过账户过滤出来的联系人),该表是由Contactsprovider 的ContactAggregator.java自动维护,用户不会对此表进行操作。该表保存了联系人的contact_id、联系次数times_contacted、最后一次联系的时间latest_time_contacted、是否含有号码has_phone_number、是否被添加到Favorites联系人starred等信息。contacts是由raw contacts经过整合而来的,一个contacts可以由一个或多个raw contacts组合而成。raw_contacts将关联或删除之后的联系人等信息处理之后,然后将数据整合到contacts表(该操作在contactprovider中自动完成)。
2、raw_contacts表
保存了所有联系人的基本信息(包括各个账户的联系人,被删除的信息,关联之前的联系人信息等),每个联系人占一行,表里有一列deleted标识该联系人是否被删除(字段值为1:删除, 否则为0),该表保存的两个ID值: raw_contact_id和contact_id,从而将contacts表和raw_contacts表联系起来。该表保存了联系人是否只读raw_contacts_read_only、联系人修改次数version、是否被添加到Favorites联系人starred、显示的名字display_name、用于排序的首字母和汉语拼音sort_key等信息。
若联系人的deleted列为1时,raw_contacts在进行同步联系人的时候,service会将删除掉该表中对应的数据!!!
该记录被删除之后触发 raw_contacts触发器执行删除data等其他表中对应的数据:
3、data表
保存了所有联系人的详细信息,每个字段占一行,该表通过raw_contact_id字段将data表和raw_contacts表联系起来。联系人的所有信息保存在列data1至data15中,该15列内容根据mimetypes_id与mimetypes 表相关联。其中包含邮箱信息,电话信息,是否有头像等内容,各列中保存的内容根据mimetype_id的不同而不同。
4.Accounts:
该表存放手机联系人账户信息, Android通过不同账户来管理手机联系人, 如:本地联系人账户(Phonecontacts),SIM card账户(单卡:SIM account, 双卡:SIM1 account、SIM2 account), Facebook 账户(Facebook account) 等
5.agg_exceptions
该表保存关联联系人的信息, 通过连个raw_contacts_id 进行关联, 用户可以使用name关联或 phone number关联。
6. calls:
该表存储用户的通话记录,表中保存了联系人的姓名, 通话日期,号码类型(家庭,工作等),显示格式等信息。 Phonebook通过该表获取到用户最近一段时间的通话记录,此表是由framework层的拨打电话app进行的增操作,若用户在call log 中删除单条或多条记录时,该表中的记录也相应删除。 该表中的name 字段通过与联系人的contacts表关联,判断是否该号码存储到了手机。
7. delete_contacts:
该表存放了被用户删除的联系人, 在raw_contacts表里的 delete 字段控制, 若为删除则为1, 否则为0. 该表的清除数据会在触发一个删除联系人之后系统会删除最近一段时间的联系人
8. goups
存放联系人组的信息。该表通过联系人账户,新建不同的联系人组,即一个联系人账户可以建多个组, 每个组对应一个唯一的 _id, title 等信息,用户将联系人增加到某组后,系统会建立视图,将group_id与data_id 关联进行查询。
9. speed_dial_lookup_somc
该表存放快捷拨号的信息,它与data 表关联之后,可以将data表里的某个号码数据设置为快捷号码。
7.settings
该表存放了不同账户是否可以同步等信息。
10.mimetpye
该表存放联系人的数据类型, 包括
手机号码:vnd.android.cursor.item/phone_v2
联系人姓名:vnd.android.cursor.item/name
邮箱:vnd.android.cursor.item/email_v2
… …