Android Contacts源码解析2
来源:互联网 发布:对称轴画图软件手机 编辑:程序博客网 时间:2024/06/09 23:06
Android Contacts源码解析2
- Android Contacts源码解析2
- 4 ContactsProvider模块
- 1ContactsProvider简介
- 2数据库创建
- 3主要数据库的表结构相互关系
- 1data表
- 2raw_contacts表
- 3contacts表
- 4mimetypes
- 5其他表
- 4 ContactsProvider模块
第一篇:Android Contacts源码解析1
4, ContactsProvider模块
4.1,ContactsProvider简介:
数据操作层。
ContactsProvider类的结构:
ContactsProvider
中数据操作基类是AbstractContactsProvider.java
,它继承ContentProvider
组件类并实现了SQLiteTransactionListener
。
可以发现,该类是抽象基类,在里面实现了ContentProvider
类的insert
、delete
和update
三个抽象方法,在这三个方法中在其中使用了事务对数据库进行操作,方法为insertInTransaction
,updateInTransaction
和deleteInTransaction
。该类在对数据库进行事务操作的同时,对子类开放了onBegin
、onRollback
,onCommit
事务回调方法,子类可以根据自己的业务特点进行扩展。
以Insert为例,基本时序图为:
4.2,数据库创建
数据库的一些概念性知识:
数据库索引:
对数据库表中一个或多个列的值进行排序的结构。排序之后进行搜索会更加有效率,也就是说,索引有助于更快地获取信息。
数据库视图:
将数据库的多个表的多个列组合为一张虚拟的表,称之为视图,方便查询,同时也掩饰了底层数据库的复杂性,把数据库设计的复杂性与用户屏蔽分开。
数据库触发:
触发器是一种特殊类型的存储过程,它在指定的表中的数据发生变化时自动生效。唤醒调用触发器以响应 INSERT、UPDATE 或 DELETE 语句。
常见的触发器有两种:before和after,决定触发的时机。
数据库的创建主要通过ContactsDatabaseHelper和LegacyApiSupport来进行创建。 ContactsDatabaseHelper
类是单例类,继承了SQLiteOpenHelper
,所以同一时刻不同的ContentProvider
只能得到一个数据库引用。
当用户调用ContactsDatabaseHelper
的OnCreate
之后,先完成自己模块内定义的操作,然后执行LegacyApiSupport
中的crateDatabase()
。
4.3,主要数据库的表结构、相互关系
联系人的数据库文件的位置:
/data/data/com.android.providers.contacts/databases.contacts2.db
数据库中主要的几张表之间的关系:
可以发现,`Contacts`表和`raw contact`表是一对多的关系,`Contacts`表是对`raw contact`表记录的聚合,即`Contacts`表中是没有账户(Account)的概念的,而`raw contact`表是联系人特定账户的的概要信息,`Data`表则存储了联系人的详细信息,比如email、电话号码等。
1、data表
- 该表保存了所有创建过的联系人的所有信息,每条信息占一行,该表保存了两个ID:
MimeTypeID
和RawContactID
,从而将data
表和raw_contacts
表、mimetypes
联系起来。 Data
表储存所有与RawContract
相关具体的信息。表的每一条记录对应一个特定信息,如:名字、电话,email地址, 头像和组信息等。每一记录通过一个mimetype_id
字段来表明该行所记录的数据类型。例如,如果row的数据类型是Phone.CONTENT_ITEM_TYPE
,那么第一个字段应该保存电话号码,如果数据类型为Email.CONTENT_ITEM_TYPE
,那么这一记录的字段应该保存邮件地址。- 联系人的所有信息保存在列data1至data15中,各列中保存的内容根据
MimeTypeID
的不同而不同。如保存号码(MimeTypeID=5)的那行数据中,data1列保存号码,data2列保存号码类型(手机号码/家庭号码/工作号码等)。
Data表的字段主要有:
Data表的索引Index有:
_id data表的Id列
Mimetype_id 存储的信息的类型
raw_contact_id 所属的raw_contact的id
Data表的触发Trigger有:
[data_updated] 数据更新时触发RawContacts表更新数据update {@link RawContacts#VERSION}
[data_deleted] 数据被删除时触发RawContacts表更新数据update {@link
RawContacts#VERSION}
2、raw_contacts表
raw contact
表描述了联系人每个账户下的数据,根据账户名和账户类型字段进行区分。即同一个联系人可能在raw contact
表中有多个记录,每个记录分属于不同的账户。表中的每一行表示一个联系人某一特定帐户的信息,存储Data
表中一些数据行的集合及一些其他的信息。当插入一个
raw contact
或当一个raw contact
所属的一个data
改变时,系统会检查这个raw contact
跟其他的raw contact
是否可以匹配(比如如果两个raw contact的data包含相同的电话号码或名字),如果匹配他们就会被综合到一起,也就是说他们会属于同一个contact
,表现为在RawContact
表中他们引用的cantact_id
是一样的。联系人姓名、组织、电话号码、Email或昵称的改变会引发raw contact
的重新聚合。
raw contact的主要字段有:
raw contact的索引有:
[] PRIMARY [_id] AUTOINCREMENT [raw_contact_sort_key1_index] [sort_key] [raw_contact_sort_key2_index] [sort_key_alt] [raw_contacts_contact_id_index] [contact_id] [raw_contacts_source_id_account_id_index] [sourceid] [account_id]
raw contact的触发有:
[raw_contacts_deleted]
当一个Raw_contacts被删除的时候,自动删除Data表中相关的Data。(即Raw_contacts的id为删除的那个id)
[raw_contacts_marked_deleted]
Triggers that update {@link RawContacts#VERSION} when the contact is marked for deletion。
3、contacts表
每个联系人占一行,该表保存了联系人的ContactID、联系次数、最后一次联系的时间、是否含有号码、是否被添加到收藏夹等信息。 Contact
表不能被主动创建,Contact表中的一行表示一个联系人,它是RawContact表中的一行或多行的数据的组合。这些RawContact表中的每一行,表示同一个人的不同的帐户信息。Contact中的数据由系统组合RawContact表中的数据自动生成,不可以直接向这个表中插入数据,当一个raw contact被插入的时候,系统会首先查找Contact表看是否有记录跟插入的raw contact表示同一个人,如果找到了,则把找到的这个contact的_ID插入raw contact记录的CONTACT_ID字段,如果没有找到,则系统自动插入一个Contact记录并把它的_ID插入新插入的raw contact的CONTACT_ID列。
Contacts表是对raw contact表按照account type和account name进行的聚合。
Contacts表的聚合逻辑在ContactAggregator.java
文件中,该类中定义了一个成员方法.
Contacts表的主要字段:
Contacts表建立的索引:
[contact_last_updated_timestamp] 联系人上次更新时间[has_phone_number] 联系人是否有电话号码[name_raw_contact_id] raw contact ID
4、mimetypes
该表定义了所有的MimeTypeID
,即联系人的各个字段的唯一标志。
主要类型如下:
5,其他表
calls表
最的通话记录
android.provider.CallLog.Calls
phone_lookup表
groups表 ContactsContract.Groups
accounts表 android.accounts.Account
settings表 android.provider.ContactsContract.Settings
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 当前用到的序号
- Android Contacts源码解析2
- Android contacts 联系人 通讯录 源码 完全解析
- Android contacts 联系人 通讯录 源码 完全解析
- Android contacts 联系人 通讯录 源码 完全解析
- Android Contacts源码分析
- Android 4.0 Contacts 拨号界面分页方式解析(源码)
- Android Contacts源码研究心得
- Android Contacts 联系人源码分析
- Android Contacts 联系人源码分析
- Android 5.0 Contacts源码分析
- Android 5.0 Contacts源码分析
- Android 5.0 Contacts源码分析
- Android Contacts 联系人源码分析
- Android 5.0 Contacts源码分析
- Android Dialer,Mms,Contacts源码修改笔记
- android源码分析--Mms、Contacts、Dialer
- Android Dialer,Mms,Contacts源码修改笔记
- android中Contacts类的解析
- VS 加入静态库(.lib)
- svg可视化制作工具
- 让机器人更安全——(3.如何定义人机协作行为)
- 每天一个adb命令:monkey命令详解
- SQL高级语句-PRIMARY KEY 约束,为列或列集合提供了唯一性的保证。
- Android Contacts源码解析2
- 【OpenCV】笔记(5)——图像类型和基本操作
- 类方法和静态方法
- java split
- STM32 IAR 及官方库文件的更新
- SVN previous operation has not finished run clean up if it was iterrupted
- gdb不知为何显示2次析构
- 技术人员如何持续不断的成长?
- 让机器人更安全——(4.机器人的碰撞标准)