转载自http://www.2cto.com/kf/201406/309356.html

通信录是一个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

如下

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

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

本地语言环境

Android联系人数据库的更多相关文章

  1. 联系人数据库设计之AbstractContactsProvider

    个人见解,欢迎交流. 联系人数据库设计,源代码下载请自行去android官网下载. package com.android.providers.contacts; import android.con ...

  2. android 联系数据库

    联系人数据库学习 2011-10-31(这是android2.3在接触db) 简单介绍 Android中联系人的信息都是存储在一个叫contacts2.db的数据库中.该数据库的路径是:/data/d ...

  3. Android Sqlite 数据库版本更新

      Android Sqlite 数据库版本更新 http://87426628.blog.163.com/blog/static/6069361820131069485844/ 1.自己写一个类继承 ...

  4. Android开发数据库三层应用-DataSnap

    Android开发数据库三层应用-DataSnap http://www.2ccc.com/news/Html/?1517.html 核心提示:我觉得Delphi最强大的的功能之一就是开发数据库三层应 ...

  5. Android SQLite 数据库详细介绍

    Android SQLite 数据库详细介绍 我们在编写数据库应用软件时,需要考虑这样的问题:因为我们开发的软件可能会安装在很多用户的手机上,如果应用使用到了SQLite数据库,我们必须在用户初次使用 ...

  6. 玩转Android之数据库框架greenDAO3.0使用指南

    用过ActiveAndroid.玩过ORMLite,穿过千山万水,最终还是发现greenDAO好用,ActiveAndroid我之前有一篇文章介绍过 玩转Android之数据库框架ActiveAndr ...

  7. Android sqlite数据库存取图片信息

    Android sqlite数据库存取图片信息 存储图片:bitmap private byte[] getIconData(Bitmap bitmap){ int size = bitmap.get ...

  8. Android中数据库的操作流程详解

    Android中数据库的操作方法: 1.Android平台提供了一个数据库辅助类来创建或打开数据库. 这个辅助类继承自SQLiteOpenHelper类.继承和扩展SQLiteOpenHelper类主 ...

  9. Android SQLite 数据库 增删改查操作

    Android SQLite 数据库 增删改查操作 转载▼ 一.使用嵌入式关系型SQLite数据库存储数据 在Android平台上,集成了一个嵌入式关系型数据库--SQLite,SQLite3支持NU ...

随机推荐

  1. windows 2012 r2下安装sharepoint 2013错误解决

    日前,我在安装sharepoint 2013时,需要预部署一些软件,我们知道运行产品准备工具“prerequisiteinstaller”后就可以自动下载安装配置这些软件,但是使用系统为windows ...

  2. 如何正确的使用jquery-ajax

    什么是ajax ajax全称Asynchronous Javascript And XML,就是异步javascript和xml ajax的作用 ajax通常用于异步加载网页内容,以及局部更新. 实际 ...

  3. 【2016-10-25】【坚持学习】【Day12】【WPF】【Telerik】【VirtualtionData 虚拟化数据】

    VirtualQueryableCollectionView When working with the UI components that enable UI Virtualization, yo ...

  4. BZOJ 1061: [Noi2008]志愿者招募 [单纯形法]【学习笔记】

    1061: [Noi2008]志愿者招募 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 3975  Solved: 2421[Submit][Stat ...

  5. 线程同步以及 yield() wait()和notify()、notifyAll()

    1.yield() 该方法与sleep()类似,只是不能由用户指定暂停多长时间,并且yield()方法只能让同优先级的线程有执行的机会. 2.wait()和notify().notifyAll() 这 ...

  6. 开源任务管理平台TaskManagerV2.0介绍及升级说明

    上一篇开源任务管理平台TaskManager介绍发布后,有网友联系我看看能不能做个后台管理界面,方便管理系统中所有的任务.由于时间和技术问题1.0版本的时候,新增了一个3分钟读取配置文件动态修改任务的 ...

  7. Linux 中 Nginx 重启关闭

    如果服务器正在运行的 Nginx 要进行升级.添加或删除模块时. 我们需要停掉服务器并做相应修改,这样服务器就要在一段时间内停止服务. Nginx可以在不停机的情况下进行各种升级动作而不影响服务器运行 ...

  8. go 聊天室简单版总结

    /* * 思路:在登录成功时将用户的id存进在线用户列表中的key value中链接的ws为空,并保存用户的信息. * 当跳转到聊天室时,将用户和聊天室链接的ws存进在线用户列表中的 * 问题:如何在 ...

  9. Asp.Net MVC<六>:Controller、Action 待续

    控制器 抽象类Controller Visual Studio的向导创建的Controller类型继承自抽象类Controller. 它是ControllerBase的子类. 实现了IControll ...

  10. MySQL学习

    关于MySQL学习,先推荐一个网站,资源很多.讲得很细 StudyMySQL-最好的MySQL学习网站 我的MySQL学习之旅: 1.简单了解下MySQL数据库,安装MySQL.MySQL管理工具(刚 ...