联系人数据库学习

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

联系人数据库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,server端的版本在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。

这表明同步适配器须要创建一个新的联系人的在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

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

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

本地语言环境

 

contacts2.db一些辅助数据库表后,。

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

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

  1. Android Sqlite 数据库版本更新

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

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

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

  3. Android SQLite 数据库详细介绍

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

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

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

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

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

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

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

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

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

  8. 图解IntelliJ IDEA 13版本对Android SQLite数据库的支持

    IntelliJ IDEA 13版本的重要构建之一是支持Android程序开发.当然对Android SQLite数据库的支持也就成为了Android开发者对IntelliJ IDEA 13版本的绝对 ...

  9. Android Realm数据库使用指南

    Android Realm数据库使用指南 Realm数据库, 目前有Java, Objective‑C, React Native, Swift, Xamarin的几种实现, 是一套用来取代SQLit ...

  10. android 本地数据库sqlite的封装

    单机android   sqlite数据库的实现,这个数据库可与程序一起生成在安装包中 一.下载sqlite3.exe文件 二.运行 cmd 转到sqlite3.exe 所在目录  运行 sqlite ...

随机推荐

  1. HTML5 CSS3专题 纯CSS打造相冊效果

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/30993277 今天偶然发现电脑里面还有这种一个样例.感觉效果还不错,不记得啥时候 ...

  2. Learning Cocos2d-x for WP8(9)——Sprite到哪,我做主

    原文:Learning Cocos2d-x for WP8(9)--Sprite到哪,我做主 工程文件TouchesTest.h和TouchesTest.cpp 相关素材文件 事件驱动同样适用于coc ...

  3. java性能缓慢

    虚拟帝国上面有很多营销软件是JAVA开发的!创业公司通常选择开源技术减少项目管理费用. 除了使用Java编程语言,创业公司也可以利用Java开发工具包的好处(JDK),Java运行时环境(JRE)和J ...

  4. Webserver管理系列:1、安装Windows Server 2008

    简单了解下server: 1U: 2U: 3U: 在安装Windows Server 2008之前我们先了解下Windows Server 2008: Windows Server 2008是微软一个 ...

  5. linux下Oracle11g RAC搭建(九)

    linux下Oracle11g RAC搭建(九) 八.创建ASM仓储 相同在图形化界面操作 [root@node1 ~]#  su - grid [grid@node1 ~]$ asmca   //创 ...

  6. 高速幂 POW优化

    #include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h&g ...

  7. poj1182食物链(种类并查集)

    http://poj.org/problem?id=1182 r[x] = 0 表示x和父亲是同类r[x] = 1 表示x吃父亲r[x] = 2 表示x被父亲吃因为只存在三种动物,且三种动物构成了环形 ...

  8. Android 调试native的crash和anr

    1. 于trace找到相应的库.例如 liba.so和相应的地址信息 2. 采用addr2line 查看 addr2line 住址 -e liba.so -f 要么 arm-eabi-addr2lin ...

  9. Sublime Text 3 最性感的编辑历史

    ↑ ↑ ↑ ↑ ↑ 请参阅文件夹 ↑ ↑ ↑ ↑ ↑ 下载 / 装 windows / MAC OS 官网下载.双击安装,这个都会吧- linux linux下安装.一种办法是从官网下载 tar.bz ...

  10. 部署IIS错误