您的位置:首页 > 数据库

联系人数据库contacts2.db介绍

2016-04-01 16:29 471 查看
http://www.cnblogs.com/xiaoxiaoshen/p/5167642.html

项目描述:该项目为基于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、电话号码等。

在有限的人生中,你总是在追寻更大的世界,在忙碌中,赢得更多人生财富,也在前进中,扩展生命的宽度,活在当下,去收获更多激情,也活出自我,懂得放弃更多,每一次的自由,让心更辽阔,你走得越远,就越知道,世界再大,总有牵挂,因为,爱,一直都在!

raw_contacts表,DELETED标志位的作用是,当删除一条用户记录时,可以暂时再内部维护一条删除状态的记录,待该账户的server端删除完毕后,再从本地删除。

但是当在contact应用里删除whatsapp账户时,raw_contacts表这条记录的DELETED标志位为1,但是server端不删除whatsapp账户,因为[b]whatsapp[/b]账户的server端认为只有删除该账户关联的手机号码时才在server删除whatsapp账户。所以导致在进入whatsapp应用点击刷新时,从whatsapp
 
server端更新联系人数据到本地whatsapp应用,会将[b]contact应用已删除的[b]whatsapp数据复制一遍到data表,每刷新一次就会复制一次,导致data表越来越大,最后造成系统空间越来越小,死机。[/b][/b]

解决方法,判断[b]raw_contacts表这条whatsapp记录DELETED标志位是否为1,如果为1,则不去复制数据到data表(insertData时不插入已删除的whatsapp数据)。[/b]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: