联系人数据库学习

2011-10-31(这是android2.3上联系人的db)

简介

Android中联系人的信息都是存储在一个叫contacts2.db的数据库中。该数据库的路径是:/data/data/com.android.provider.contacts/databases/contacts2.db。如图1:



我们可以在cmd中通过adb命令把该文件拉出来(具体口令为:adb pull/data/data/com.android.provider.contacts/databases/contacts2.db 要存放的路径\自定义名字.db), 可以使用SQLiteSpy工具来查看该数据库。如图2:

android 联系人数据库_第1张图片


ContactsContract.java这个类就是去解释和翻译这个contacts2.db数据库的。所有的联系人Uri,与联系人相关数据库字段均在此定义。这个类中有很多的内部接口和内部类,用来翻译一些表,例如Data内部类,RawContacts内部类等。

通信录是一个3层的数据存储模型,这三个数据模型就是ContactsContact.Data,ContactsContact.RawContacts,ContactsContact.Contacts。对应三个表:data、raw_contacts、contacts。

1) contacts表

表保存了所有的手机测联系人,每个联系人占一行,该表保存了联系人的ContactID、联系次数、最后一次联系的时间、是否含有号码、是否被添加到收藏夹等信息。contacts是由raw contacts经过整合而来的,一个contacts可以由一个或多个raw contacts组合而成。

2、raw_contacts表

表保存了所有创建过的手机联系人,每个联系人占一行,表里有一列标识该联系人是否被删除,该表保存了两个ID: RawContactID和ContactID,从而将contacts表和raw_contacts表联系起来。该表保存了联系人的RawContactID 、ContactID、联系次数、最后一次联系的时间、是否被添加到收藏夹、显示的名字、用于排序的汉语拼音等信息。

3、data表

表保存了所有创建过的手机联系人的所有信息,每个字段占一行,该表保存了两个ID: MimeTypeID和RawContactID,从而将data表和raw_contacts表联系起来。联系人的所有信息保存在列data1至data15中,各列中保存的内容根据MimeTypeID的不同而不同。

联系人数据库contact2.db中的表

data表

ContactsContact.Data

_id

行id

package_id

mimetype_id

当前行保存的mimetype类型的id。1为邮箱;2聊天账号;3住址;4图片;5电话号码;6姓名;7公司+职位;8昵称;9所属组;10备注;11网址

raw_contact_id

raw_contacts表的_id

is_primary

是否是它属于的raw_contacts的primary entry,“1”true,“0”false

is_super_primary

data_version

数据记录的版本。每当数据行更改版本上升。这个值是单调递增的。

data1 到data15

通用数据列(保存着联系人的信息,联系人名称、联系人电话号码、电子邮件、备注等)。各列的含义是由mimetype_id的类型确定的。data15用于存储的BLOB(二进制数据)(存储图片)。

data_sync1 到

data_sync4

同步适配器使用的通用列。例如,照片行可以存储图像的URL在SYNC1,状态(不加载,加载,加载错误)在SYNC2,服务器端的版本号在SYNC3和错误代码在SYNC4。

contacts表

ContactsContact.Contacts

_id

行id,建议用LOOKUP_KEY代替

name_raw_contact_id

raw_contacts表的_id

photo_id

是否含有图片。引用data表的 _id,在data_id含有相应的mime_type_id, 根据mime_type_id的CONTENT_ITEM_TYPE 查图片

custom_ringtone

与联系人相关的铃声

send_to_voicemail

指示器,判断是否来自此联系人的电话是否发送到语音信箱(1)或(0)。当是多个raw_contacts聚合时,这一领域的自动计算:如果所有聚合的raw_contacts 都设置SEND_TO_VOICEMAIL=1,那么这个字段设置为'1'。设置此字段,会自动更改所有聚合的raw_contacts的相应的字段。

times_contacted

与该联系人联系的次数

last_time_contacted

上次联系的时间

statrred

是否是常用联系人;是(1),否(0)

in_visible_group

这个联系人在UI中是否可见; 是(1),否(0)

has_phone_number

该联系人否至少有一个手机号码; 是(1),否(0)

lookup

一个不透明的值(是一个持久化的储存),提示如何找到特定联系的值(如果因同步或聚集而改变其行ID的值)

status_update_id

single_is_restricted

raw_contacts表

ContactsContract.RawContacts

_id

行id 。同步适配器应尽量在更新过程中的维护行ID。换句话说,同步适配器更新的一个raw_contact,而不是删除并重新插入会是更好的。

is_restricted

account_name

指明该联系人是从哪个账户上同步下载下来的。

account_type

帐户的类型

source_id

此行账户的类型的独特的标示。通常它在raw contact是插入时建立,事后从未改变。一个值得注意的例外是一个新的raw contact:将有一个帐户名和类型,但没有source id。这表明同步适配器需要创建一个新的联系人的在服务器端和把它的ID存储在手机上相应的SOURCE_ID字段。

version

版本;当列或相关数据修改时,将会自动修改

dirty

版本发生改变的标记; (此行需要将其拥有的帐户同步,当raw contact发生改变时,自动设为1(除 URI has the CALLER_IS_SYNCADAPTER外)。同步适配器应始终提供查询参数,以防止不必要的同步:用户改变服务器上的一些数据,同步适配器更新手机上的联系人(无CALLER_IS_SYNCADAPTER标志)标志,当设置dirty标志,从而触发同步,同步变化到服务器)

delete

删除标记;0 or 1;1 表示标记为被删除。

contact_id

contacts 表中的_id。通过聚合的过程raw contacts 被链接到contact,它被AGGREGATION_MODE字段和ContactsContract.AggregationExceptions控制。

aggregation_mode

聚合模式。值为AGGREGATION_MODE_DEFAULT, AGGREGATION_MODE_DISABLED 或AGGREGATION_MODE_SUSPENDED.

aggregation_needed

0或者1

custom_rington

与该记录相关的手机铃声

send_to_voicemail

指示器,判断来自此联系人的电话是否发送到语音信箱(1)或(0)。当是多个raw_contacts聚合时,这一领域的自动计算:如果所有聚合的raw_contacts 都设置SEND_TO_VOICEMAIL=1,那么这个字段设置为'1'。设置此字段,会自动更改所有聚合的raw_contacts的相应的字段。

times_contacted

与该联系人联系的次数

last_time_contacted

上次联系的时间

statrred

是否是常用联系人;是(1),否(0)

display_name

联系人显示名称(它可能是电子邮件地址,如果联系人显示名称是不可用)

display_name_alt

联系人显示名称的替代表示,如西方名字“名在前”而不是 “姓在前”。

display_name_source

作为联系人的显示名称使用的数据类型,如结构化姓名或电子邮件地址。

phonetic_name

phonetic_name_style

soft_key

排序的关键,考虑账户中语言环境,按地址簿中的显示名称进行排序。对应display_name (姓名拆分加拼音:如“墨迹”,则为“MO墨JI迹”)。

soft_key_alt

排序键,基于全名的拼音,对应display_name_alt(姓名拆分加拼音:如“墨迹”,则为“MO墨JI迹”)

name_verified

contact_in_visible_group

这个联系人在UI中是否可见; 是(1),否(0)

sync1 到sync4

mimetypes表

_id

行id ,与data表中的mimetype_id对应

mimetype

如下

_idmimetype

1vnd.android.cursor.item/email_v2

2vnd.android.cursor.item/im

3vnd.android.cursor.item/postal-address_v2

4 vnd.android.cursor.item/photo

5vnd.android.cursor.item/phone_v2

6vnd.android.cursor.item/name

7vnd.android.cursor.item/organization

8vnd.android.cursor.item/nickname

9vnd.android.cursor.item/group_membership

10vnd.android.cursor.item/note

11vnd.android.cursor.item/website

12 vnd.android.cursor.item/relation

13 vnd.android.cursor.item/contact_event

1为邮箱;2聊天账号;3住址;4图片;5电话号码;6姓名;7公司+职位;8昵称;9所属组;10备注;11网址

calls表

android.provider.CallLog.Calls

_id

行id ,

number

通话电话号码

data

拨打该电话号码的开始时间(以1970-01-01 00:00:00)计算到当前的时间差以毫秒为单位

duration

打电话持续时间,以秒为单位

type

呼叫类型(“1”来电,“2”外拨,“3”未接)

new

呼叫已被确认与否。“1”代表来电,外拨,“0”代表未接

name

如果联系人存在,与电话号码相关联的联系人的名字

numbertype

如果联系人存在,与电话号码相关联的电话类型

numberlabel

如果联系人存在,自定义数字类型相关联的电话号码数字标签(例如VOICE)(numbertype 为1-7时numberlabel为null;为0时显示自定义标签)

typedial

拨打电话的类型(语言电话、视频电话)

phone_lookup表

data_id

通过data_id可以找到 data表中相对的数据。

raw_contact_id

通过raw_contact_id 可以找到 raw_contact_表中相对的数据

normalized_number

将每个电话号码逆序排列

min_match

groups表

ContactsContract.Groups

_id

行id

package_id

account_name

账户名字

account_type

帐户的类型

sourceid

version

版本;当列或相关数据修改时,将会自动修改

dirty

版本发生改变的标记

title

这组显示的标题

title_res

notes

这组的注释

system_id

如果它是一个系统组,这个组的ID,即对同步适配器具有特殊意义的一组,否则返回null。

deleted

删除标记;0 or 1;1 表示标记为被删除。

group_visible

群组是否在UI中 是否可见;是(1),否(0)

should_sync

这组是否应该同步,是(1),否(0)

sync1到sync4

accounts表

android.accounts.Account

account_name

账户名字

account_type

账户类型

settings表

android.provider.ContactsContract.Settings

account_name

账户名字

account_type

账户类型

ungrouped_versible

标志该组是否在UI中可见;“1”可见,“0”不可见

should_sync

根据同步适配器定义的模式,这个标志控制此数据源的顶级的同步行为。

agg_exceptions表

ContactsContract.AggregationExceptions

_id

type

异常的类型:TYPE_KEEP_TOGETHER(1),TYPE_KEEP_SEPARATE(2)或TYPE_AUTOMATIC(3)。

raw_contact_id1

A reference to the _ID of the raw contact that the rule applies to.

raw_contact_id1

A reference to the other _ID of the raw contact that the rule applies to.

raw_contact_id1和raw_contact_id2之间通过规则(type)引用

sqlite_sequence表

SQLite中的自动编号列

name

自动编号字段所在的表

seq

当前用到的序号

calls 的seq为7 说明我们的通话记录有7个。

在开发过程中,我们经常要把表重置。也就是说把表中的记录全部清空,并把自动编号归0。在SQLite中,只需要修改 sqlite_sequence 表就可以了:

UPDATEsqlite_sequence SET seq = 0 WHERE name = 'TableName'

也可以直接把该记录删掉:

DELETEFROM sqlite_sequence WHERE name = 'TableName'

要是想重置所有表,那直接把 sqlite_sequence 清空就可以了:

DELETEFROM sqlite_sequence

_sync_state表

ContactsContract.SyncState

_id

行id

account_name

账户名字

account_type

账户类型

data

android_metadata

locale

本地语言环境

contacts2.db数据库中的有些表以后补充。

更多相关文章

  1. Android Contacts 联系人源码分析
  2. Android联系人数据库全解析-2.0以上
  3. android必备知识(一)java引用类型
  4. 魅族手机 Android5 获取手机联系人返回空指针
  5. Android获取系统的硬件信息、系统版本以及如何检测ROM类型
  6. android添加联系人(直接添加到联系人数据库)

随机推荐

  1. Mac OS X下用Eclipse浏览和编译Android源
  2. Android之网络请求2————OkHttp的基本
  3. 高通平台android 环境配置编译及开发经验
  4. 图解android事件分发机制
  5. android创建隐藏文件或者文件夹,并对其读
  6. Android ListView 滑动背景为黑色的解决
  7. Android工程目录介绍
  8. Android基础教程(八)之仿百度谷歌搜索自
  9. Android 项目开发填坑记 - 使用 MultiDex
  10. Android API中隐藏的类使用(例如IWindowM