联系人数据库学习

2011-10-31(这是android2.3在接触db)

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhbzcxMzQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

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

如图2:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhbzcxMzQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

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的不同而不同。

中的表

ContactsContact.Data

行id

package_id

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

raw_contact_id

表的_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,server端的版本在SYNC3和错误代码在SYNC4。

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

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

in_visible_group

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

has_phone_number

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

lookup

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

status_update_id

single_is_restricted

ContactsContract.RawContacts

_id

行id 。

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

is_restricted

account_name

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

account_type

帐户的类型

source_id

此行账户的类型的独特的标示。通常它在raw contact是插入时建立,事后从未改变。一个值得注意的例外是一个新的raw contact:将有一个帐户名和类型。但没有source id。

这表明同步适配器须要创建一个新的联系人的在server端和把它的ID存储在手机上对应的SOURCE_ID字段。

version

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

dirty

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

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_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

行id ,与data表中的mimetype_id相应

mimetype

例如以下

_id  mimetype

1    vnd.android.cursor.item/email_v2

2    vnd.android.cursor.item/im

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

4     vnd.android.cursor.item/photo

5    vnd.android.cursor.item/phone_v2

6    vnd.android.cursor.item/name

7    vnd.android.cursor.item/organization

8    vnd.android.cursor.item/nickname

9    vnd.android.cursor.item/group_membership

10   vnd.android.cursor.item/note

11   vnd.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网址

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

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

通过data_id能够找到 data表中相对的数据。

raw_contact_id

通过raw_contact_id 能够找到 raw_contact_表中相对的数据

normalized_number

将每一个电话号码逆序排列

min_match

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)

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

sync1到sync4

android.accounts.Account

account_name

账户名字

account_type

账户类型

android.provider.ContactsContract.Settings

account_name

账户名字

account_type

账户类型

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

should_sync

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

ContactsContract.AggregationExceptions

_id

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

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中的自己主动编号列

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

ContactsContract.SyncState

_id

行id

account_name

账户名字

account_type

账户类型

data

locale

本地语言环境

 

一些辅助数据库表后,。

版权声明:本文博主原创文章。博客,未经同意不得转载。

05-11 09:39