下面的讲解基于AndroidM
整体认识
联系人应用其主要的功能就是管理手机中存储的联系人信息,为了更好的管理信息数据,我们就引入了数据库,所以对于联系人的整体认识,我们就可以将其看成是数据库,联系人的整个业务逻辑都会围绕数据库展开。
源码路径和类
android/packages/apps/Dialer
android/packages/apps/Contacts
android/packages/apps/ContactsCommon
android/packages/providers/ContactsProvider
android/packages/providers/CallLogProvider
android/vendor/qcom/proprietary/telephony-apps/SimContacts
data/data/com.android.dialer/databases/dialer.db
data/data/com.android.providers.contacts/databases/contacts2.db
data/data/com.android.providers.contacts/databases/profile.db 机主信息数据库
ContactsDatabaseHelper.java 数据库创建类
ContactsProvider2.java 数据库操作类
ContactContract.java 数据库定义类
部分UI相关类
上图列出了部分界面相关的类和说明,这里列出了应用中大部分可以见的activity、fragment和view
主界面
上图是contacts的主界面PeopleActivity,对应颜色的图形与对应颜色的类名相对应,这里只对主界面做了简单介绍,其它的界面读者可以通过IDE工具或者源码去分析。
数据库
上图是对于contacts数据库的整体截图,我们可以看到,数据库中的表有很多,每张表都有不同的作用,我们这里比较关心的是图中用红色矩形框出来的表,从官方给出的介绍图可以看出,一个contact对应多个row contact,一个row contact 对应多个data。
各个表中对应数据的含义
contacts表
- name_raw_contact_id:对应raw_contacts表中的id,即界面显示的contact
- photo_id:模糊大头贴id
- photo_file_id:清晰大头贴id
- custom_ringtone:个人铃声
- send_to_voicemail:来电转接语音信箱(0 false,1 true)
- times_contacted:联系人联系次数
- last_time_contacted:最近一次联系的时间
- starred:是否收藏
- pinned:是否被固定
- has_phone_number:是否有号码(至少一个)
- lookup:查找此联系人的key值
- contact_last_updated_timestamp:联系人最后修改时间
raw_contacts表
- account_id:记录所属账户id
- sourceid:数据源id
- backupid:数据备份时产生的id
- raw_contact_is_read_only:是否只读(1只读,0可删除)M中没用
- version:数据发送变化时改变
- dirty: version变化,值为1,需同步数据
- deleted:标记是否为删除的记录
- contact_id:对应contacts表中的id
- aggregation_mode:标记是否需要合并(default:0?immediate:1 suspended:2 disabled:3 )
- aggregation_needed:是否需要合并(1需要,0不需要)
- custom_rington:与该记录相关的手机铃声
- send_to_voicemail:来电转接语音信箱
- times_contacted:与该联系人联系的次数
- last_time_connected:最近一次联系时间
- starred:是否收藏(1收藏,0没收藏)
- pinned:是否被固定
- display_name:联系人显示名称
- display_name_alt:联系人显示名称的替代表示(如西方名字“名在前”)
- display_name_source:名字显示数据类型:email、phone、name
- phonetic_name: 发音名字
- phonetic_name_style:名字不同发音风格(undefined=0,pinyin=3,japanese=4,korean=5)
- sort_key:排序字段
- phonebook_label:首字母
- phonebook_bucket:对应首字母的排序
- sync1、2、3、4:同步相关,保存uri,同步状态,服务器版本,错误代码等等
data表
- mimetype_id:数据类型id,对应mimetypes表
- raw_contact_id:对应raw_contact的id
- is_primary,is_super_primay:是否为默认号码
- data_version:此数据记录的版本,每当数据行更改版本上升,此值单调递增
- data1-data15 :同类数据的不同形式的表达方式
- carrier_presence:载波信息
- -
accounts表
存储当前联系人有哪些账户信息,比如:SIM、Google、localphone等等。
calls表
记录了dialer里面的通话信息,包括:通话时间,号码,次数,类型,等等。
mimetypes表
里面记录了数据库中所有数据的类型。
其它
还有一些相关的view,比如:view_contacts、view_data、view_row_contacts等等,这些视图包含了上面的多个表的数据,一般的查询操作都是对view的操作。
一个联系人信息