联系人数据库contacts2.db介绍
项目描述:该项目为基于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、电话号码等。