Android 联系人数据库contacts2.db介绍

 

参考:

http://blog.csdn.net/flying_vip_521/article/details/7258805


https://my.oschina.net/gabriel1215/blog/492051


个人总结:

通话记录相关字段:

 CallLog.Calls.DATE,// 通话开始时间
 CallLog.Calls.NUMBER, //对方手机号
 CallLog.Calls.DURATION,//通话时长
 CallLog.Calls.TYPE //类型:来电or去电

 呼叫记录有6种类型:

       来电:CallLog.Calls.INCOMING_TYPE (常量值:1)

       已拨:CallLog.Calls.OUTGOING_TYPE(常量值:2)

       未接:CallLog.Calls.MISSED_TYPE(常量值:3)

       wifi来电:CallLog.Calls.INCOMING_WIFI_TYPE(常量值:20)

       wifi已拨:CallLog.Calls.OUTGOING_WIFI_TYPE(常量值:21)

       wifi未接:CallLog.Calls.MISSED_WIFI_TYPE(常量值:22)



 String[] projection = { CallLog.Calls.DATE, CallLog.Calls.NUMBER, CallLog.Calls.DURATION,CallLog.Calls.TYPE };
 Cursor query = getContentResolver().query(CallLog.Calls.CONTENT_URI, projection, selection,null, null);






技术要点一:熟悉Android联系人数据库contacts2.db

1.获得联系人数据库contacts2.db文件

步骤一、打开Eclipse并且运行模拟器;

步骤二、调出文件浏览器File Explorer(从工具栏中依次打开Windows—>Show View -> Other -> Android - > File Explorer),如图所示:

Android 联系人数据库contacts2.db介绍_第1张图片

步骤三、打开文件浏览器,并在此目录data->data->com.android.providers.contacts->databases下,找到数据库:contacts2.db,注意:如果是想导出真机上的contacts2.db数据库,真机必须是经过root以后才能导出,否则在data目录层就打不开。

Android 联系人数据库contacts2.db介绍_第2张图片

步骤四、选中contacts2.db,并且在File Explorer的右上角,选择导出键,将contacts2.db数据库导入到电脑上。

Android 联系人数据库contacts2.db介绍_第3张图片

步骤五、下载数据库可视化软件,用来帮我们打开contacts2.db,查看其中的表结构,这里我推荐使用sqlitestudio,附上下载链接:链接地址

步骤六、安装sqlitestudio,安装成功后,打开软件并导入contacts2.db数据库

Android 联系人数据库contacts2.db介绍_第4张图片

步骤七、双击Contacts2数据库,就能看到Contacts2.db里面所有的表

Android 联系人数据库contacts2.db介绍_第5张图片

步骤九、双击data表,查看表的结构

Android 联系人数据库contacts2.db介绍_第6张图片

步骤十、点击工具栏上方的数据,就可以查看表中的内容

Android 联系人数据库contacts2.db介绍_第7张图片


2.介绍contacts2.db数据库

有关通讯录的资料都放在contacts2.db中这个数据库中,本次项目开发主要使用到的表分别如下:


contacts表

Contacts表是对raw contact表按照account type和account name进行的聚合,Contacts表的聚合逻辑在ContactAggregator.java文件中。

结构图如下:

Android 联系人数据库contacts2.db介绍_第8张图片

数据图如下:

Android 联系人数据库contacts2.db介绍_第9张图片


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操作。

结构图如下:

Android 联系人数据库contacts2.db介绍_第10张图片

数据图如下(两张图合并起来):

Android 联系人数据库contacts2.db介绍_第11张图片


Android 联系人数据库contacts2.db介绍_第12张图片


data表

data表存储了联系人的具体信息,比如电话、email等信息,从下面的图我们可以看书每个raw contact表中的记录会对应多个data信息,这不难理解,一个联系人可能有多个电话号码,多个email,这些信息是如何存储在data表中的呢?其实不难解决这个问题,定义一个专门的描述字段用来定义该记录的类型,即MIME TYPE,然后根据MIME TYPE来区分该记录的类型,然后每种信息都会有一个自己的类型。

结构图如下:

Android 联系人数据库contacts2.db介绍_第13张图片

数据如下(两张图合并起来):

Android 联系人数据库contacts2.db介绍_第14张图片


Android 联系人数据库contacts2.db介绍_第15张图片


calls表

calls表主要作用是用来存放通话记录,主要使用到这些字段date(日期),number(电话号码),type(通话记录类型),name(联系人姓名)。

结构图如下:

Android 联系人数据库contacts2.db介绍_第16张图片

数据图如下(两张图合并起来):

Android 联系人数据库contacts2.db介绍_第17张图片




其中以上表中,contacts表,raw_contacts表,data表之间的关系如下图所示:

Android 联系人数据库contacts2.db介绍_第18张图片

这三张表是联系人数据库的最主要的数据表,其他的数据只是提供一些辅助功能,我们先详细介绍这三张表的结构和使用方法。

从上图我们可以看书contacts表和raw_contact表是一对多的关系,contacts表是对raw_contact表记录的聚合,即contacts表中是没有账户(Account)的概念的,而raw_contact表是联系人特定账户的的概要信息,Data表则存储了联系人的详细信息,比如email、电话号码等。

你可能感兴趣的:(Android进阶)