联系人数据库学习

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. maven中的java库

    /* *  *         <dependency>    <groupId>io.netty</groupId>    <artifactId>n ...

  2. 安装配置gerrit

    Centos 安装配置gerrit 关闭selinux,不然nginx的反向代理会报错connect() to 127.0.0.1:8080 failed (13: Permission denied ...

  3. Java中动态代理技术生成的类与原始类的区别 (转)

    用动态代理的时候,对它新生成的类长什么样子感到好奇.有幸通过一些资料消除了心里的疑惑. 平时工作使用的Spring框架里面有一个AOP(面向切面)的机制,只知道它是把类重新生成了一遍,在切面上加上了后 ...

  4. 数学思想方法-分布式计算-linux/unix技术基础(5)

    shell命令行参数 -bash-4.2$ cat test1.sh#!/bin/shecho "$0  "echo "$1  "echo "$2   ...

  5. ftk学习记(消息框篇)

    [ 声明:版权全部,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 上一篇说到了输入框.闲话不多说,首先看结果显示, 大家看看效果是不是和我们之前说的一样.今天, ...

  6. Linux学习笔记——例说makefile 头文件查找路径

    0.前言     从学习C语言開始就慢慢開始接触makefile,查阅了非常多的makefile的资料但总感觉没有真正掌握makefile,假设自己动手写一个makefile总认为非常吃力.所以特意借 ...

  7. lambda 3

    .NET笔记系列:LAMBDA表达式常用写法   这里主要是将数据库中的常用操作用LAMBDA表达式重新表示了下,用法不多,但相对较常用,等有时间了还会扩展,并将查询语句及LINQ到时也一并重新整理下 ...

  8. SQL Server 性能调优培训引言

    原文:SQL Server 性能调优培训引言 大家好,这是我在博客园写的第一篇博文,之所以要开这个博客,是我对MS SQL技术学习的一个兴趣记录. 作为计算机专业毕业的人,自己对技术的掌握总是觉得很肤 ...

  9. VS2010中使用CL快速 生成DLL的方法

    方案一: 1.命令行中输入cl example.cpp,生成example.obj和example.lib文件.有可能还会提示“没有入口点”的错误.这是因为我们的CPP中是要生成dll文件的,并没有m ...

  10. BeagleBone Black 板第三课:Debian7.5系统安装和远程控制BBB板

    BBB板第三课:Debian7.5系统安装和远程控制BBB板 由于BBB板系统是Debian 7.4.据说使用Debian系统能够实现非常多BBB板的无缝连接.能够更好的学习和控制BBB板,所以就决定 ...