android 联系数据库
联系人数据库学习
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 |
|
package_id |
|
当前行保存的mimetype类型的id。1为邮箱。2聊天账号。3住址;4图片;5电话号码。6姓名。7公司+职位;8昵称;9所属组;10备注;11网址 |
|
raw_contact_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_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 ,与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表中相对的数据。 |
|
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) |
这组是否应该同步,是(1),否(0) |
|
sync1到sync4 |
accounts表
android.accounts.Account
account_name |
账户名字 |
account_type |
账户类型 |
settings表
android.provider.ContactsContract.Settings
account_name |
账户名字 |
account_type |
账户类型 |
标志该组是否在UI中可见。“1”可见。“0”不可见 |
|
should_sync |
依据同步适配器定义的模式。这个标志控制此数据源的顶级的同步行为。 |
agg_exceptions表
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_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 联系数据库的更多相关文章
- Android Sqlite 数据库版本更新
Android Sqlite 数据库版本更新 http://87426628.blog.163.com/blog/static/6069361820131069485844/ 1.自己写一个类继承 ...
- Android开发数据库三层应用-DataSnap
Android开发数据库三层应用-DataSnap http://www.2ccc.com/news/Html/?1517.html 核心提示:我觉得Delphi最强大的的功能之一就是开发数据库三层应 ...
- Android SQLite 数据库详细介绍
Android SQLite 数据库详细介绍 我们在编写数据库应用软件时,需要考虑这样的问题:因为我们开发的软件可能会安装在很多用户的手机上,如果应用使用到了SQLite数据库,我们必须在用户初次使用 ...
- 玩转Android之数据库框架greenDAO3.0使用指南
用过ActiveAndroid.玩过ORMLite,穿过千山万水,最终还是发现greenDAO好用,ActiveAndroid我之前有一篇文章介绍过 玩转Android之数据库框架ActiveAndr ...
- Android sqlite数据库存取图片信息
Android sqlite数据库存取图片信息 存储图片:bitmap private byte[] getIconData(Bitmap bitmap){ int size = bitmap.get ...
- Android中数据库的操作流程详解
Android中数据库的操作方法: 1.Android平台提供了一个数据库辅助类来创建或打开数据库. 这个辅助类继承自SQLiteOpenHelper类.继承和扩展SQLiteOpenHelper类主 ...
- Android SQLite 数据库 增删改查操作
Android SQLite 数据库 增删改查操作 转载▼ 一.使用嵌入式关系型SQLite数据库存储数据 在Android平台上,集成了一个嵌入式关系型数据库--SQLite,SQLite3支持NU ...
- 图解IntelliJ IDEA 13版本对Android SQLite数据库的支持
IntelliJ IDEA 13版本的重要构建之一是支持Android程序开发.当然对Android SQLite数据库的支持也就成为了Android开发者对IntelliJ IDEA 13版本的绝对 ...
- Android Realm数据库使用指南
Android Realm数据库使用指南 Realm数据库, 目前有Java, Objective‑C, React Native, Swift, Xamarin的几种实现, 是一套用来取代SQLit ...
- android 本地数据库sqlite的封装
单机android sqlite数据库的实现,这个数据库可与程序一起生成在安装包中 一.下载sqlite3.exe文件 二.运行 cmd 转到sqlite3.exe 所在目录 运行 sqlite ...
随机推荐
- Jndi使用好处,与简单实例【Tomcat】
JNDI学习总结(一)——JNDI数据源的配置 一.数据源的由来 在Java开发中,使用JDBC操作数据库的四个步骤如下: ①加载数据库驱动程序(Class.forName("数据库驱动 ...
- [ACM] POJ 3259 Wormholes (bellman-ford最短路径,推断是否存在负权回路)
Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 29971 Accepted: 10844 Descr ...
- sql小技巧 group by datetime类型字段,只取其中的日期部分
工作中经常会遇到,要在sql中查询报表,查询结果要求按照日期来罗列, 或按照天, 或按照月,年. 这个时候我们经常会苦恼,datetime是精确到毫秒的,如果单纯的group by datetime就 ...
- 深度分析DataTable如何筛选
这项DataTable指SpryMedia专为HTML Table设计的插件页面和发展,官方网站:http://legacy.datatables.net/index. 左右oSettings.aiD ...
- 间隔DP基础 POJ2955——Brackets
取血怒.first blood,第一区间DP,这样第一次没有以某种方式在不知不觉中下降~~~ 题目尽管是鸟语.但还是非常赤裸裸的告诉我们要求最大的括号匹配数.DP走起~ dp[i][j]表示区间[i, ...
- 领域驱动设计(DDD)部分核心概念的个人理解(转)
领域驱动设计(DDD)是一种基于模型驱动的软件设计方式.它以领域为核心,分析领域中的问题,通过建立一个领域模型来有效的解决领域中的核心的复杂问题.Eric Ivans为领域驱动设计提出了大量的最佳实践 ...
- 【SICP读书笔记(四)】练习2.27 --- 表序列reverse的扩展:树结构的deep-reverse
题目要求是,修改练习2.18所做的reverse过程,得到一个deep-reverse过程.它以一个表为参数,返回另一个表作为值,结果表中的元素反转过来,其中的子树也反转. 例如: (define x ...
- 神马是AB測试?
手机响起了短信提示音,桂芬拿起手机,滑动解锁,看到是来福的短信,心里不禁一阵小鹿乱撞. "喜欢看<冰封重生之门>吗?" 如此充满暗示意味的短信让桂芬激动 ...
- TotoiseSVN基本用法
TotoiseSVN的基本用法 TotoiseSVN的基本用法 一.签入源码到SVNserver 假如我们使用Visual Studio在目录StartKit中创建了一个项目.我们要把这个项目的源码签 ...
- 修改系统环境变量 cmd命令
详细大家对cmd的使用都有了一些简单的了解,但是困扰大家的主要的问题就是: cmd命令修改环境变量有两种方式:1. 短期内有效,在关闭dos窗口后就自动失效 2.长期有效,关闭dos窗口后还有效 下面 ...