Android联系人分析总结

Date

Issue

Description

Author

<09/26/2016>

<0.1>

初始版本

杨冠楠

在Android中,结构化数据库时通过以下机制提供的:

Sqlite数据库:SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。

ConentProvider:内容提供器,提供一种通用的,良好的接口来使用和共享数据。

★ContactsDatabaseHelper

该类继承了SQLiteOpenHelper,SQLiteOpenHelper是一个抽象类,用来实现创建,打开数据库,主要有以下方法:

onCreate(SQLiteDatabase db):在数据库第一次产生时会调用该方法,一般用来创建数据库的表;

getWritableDatabase():打开一个可写的数据库,返回值为SQLiteDatabase;

getReadableDatabase():打开一个可读的数据库,返回值为SQLiteDatabase;

★SQLiteContentProvider,该类继承了ContentProvider,ContentProvider类中有一些常用接口比如insert(),delete()等,而SQLiteContentProvider实现了ContentProvider类中这些标准接口,从而能使其它的应用程序保存和读取到你想要的数据,那么其它应用程序是如何找到对应的Provider的呢,比如以联系人插入为例:

实际上是通过Uri找到,Uri实际上就是一个路径,content://是前缀,Android默认都是这样,com.android.contactsUri标示,它定义了那个ContentProvider提供数据,在这里当然是ContentProvider2, /raw_contacts表示的是操作那张表。

Name

Declared Type

Type

Size

Not Null

Not Null On Conflict

Default Value

_id

INTEGER

INTEGER

0

FALSE

name_raw_contact_id

INTEGER

INTEGER

0

FALSE

photo_id

INTEGER

INTEGER

0

FALSE

custom_ringtone

TEXT

TEXT

0

FALSE

send_to_voicemail

INTEGER

INTEGER

0

TRUE

0

times_contacted

INTEGER

INTEGER

0

TRUE

0

last_time_contacted

INTEGER

INTEGER

0

FALSE

starred

INTEGER

INTEGER

0

TRUE

0

in_visible_group

INTEGER

INTEGER

0

TRUE

1

has_phone_number

INTEGER

INTEGER

0

TRUE

0

lookup

TEXT

TEXT

0

FALSE

status_update_id

INTEGER

INTEGER

0

FALSE

single_is_restricted

INTEGER

INTEGER

0

TRUE

0

name_raw_contact_id:该联系人对应在raw_contact表中的id;

photo_id:保存着该联系人照片id

in_visible_group:在联系人列表中是否可见标志位

has_phone_number:该联系人是否存有电话号码

lookup:通过姓名查找的编码值

3.2         raw_contacts表,该表保存着联系人详细信息,与上面的contacts表相对应:

Name

Declared Type

Type

Size

Not Null

Default Value

_id

INTEGER

INTEGER

0

FALSE

is_restricted

INTEGER

INTEGER

0

FALSE

0

account_name

STRING

STRING

0

FALSE

NULL

account_type

STRING

STRING

0

FALSE

NULL

sourceid

TEXT

TEXT

0

FALSE

version

INTEGER

INTEGER

0

TRUE

1

dirty

INTEGER

INTEGER

0

TRUE

0

deleted

INTEGER

INTEGER

0

TRUE

0

contact_id

INTEGER

INTEGER

0

FALSE

aggregation_mode

INTEGER

INTEGER

0

TRUE

0

aggregation_needed

INTEGER

INTEGER

0

TRUE

1

custom_ringtone

TEXT

TEXT

0

FALSE

send_to_voicemail

INTEGER

INTEGER

0

TRUE

0

times_contacted

INTEGER

INTEGER

0

TRUE

0

last_time_contacted

INTEGER

INTEGER

0

FALSE

starred

INTEGER

INTEGER

0

TRUE

0

display_name

TEXT

TEXT

0

FALSE

display_name_alt

TEXT

TEXT

0

FALSE

display_name_source

INTEGER

INTEGER

0

TRUE

0

phonetic_name

TEXT

TEXT

0

FALSE

phonetic_name_style

TEXT

TEXT

0

FALSE

sort_key

TEXT

TEXT

0

FALSE

sort_key_alt

TEXT

TEXT

0

FALSE

name_verified

INTEGER

INTEGER

0

TRUE

0

contact_in_visible_group

INTEGER

INTEGER

0

TRUE

0

sync1

TEXT

TEXT

0

FALSE

sync2

TEXT

TEXT

0

FALSE

sync3

TEXT

TEXT

0

FALSE

sync4

TEXT

TEXT

0

FALSE

store_type

INTEGER

INTEGER

0

TRUE

0

account_name:该项如果是从gmail等其他第三方软件会不同,直接用手机存入都是Longcheer,通常和account_type一起联用

aggregation_mode:数据是否同步到contacts表中

sort_key:在查询联系人的时候,是否按字母顺序查询

store_type:是我们自己加入的一行,用来区分存入的是SIM卡还是手机联系人

3.3         data表,该表保存着联系人所用信息,包括电话号码,email等,是联系人中最大最复杂的一张表:

Name

Declared Type

Type

Size

Not Null

Default Value

_id

INTEGER

INTEGER

0

FALSE

package_id

INTEGER

INTEGER

0

FALSE

mimetype_id

INTEGER

INTEGER

0

TRUE

raw_contact_id

INTEGER

INTEGER

0

TRUE

is_primary

INTEGER

INTEGER

0

TRUE

0

is_super_primary

INTEGER

INTEGER

0

TRUE

0

data_version

INTEGER

INTEGER

0

TRUE

0

data1

TEXT

TEXT

0

FALSE

data2

TEXT

TEXT

0

FALSE

data3

TEXT

TEXT

0

FALSE

data4

TEXT

TEXT

0

FALSE

data5

TEXT

TEXT

0

FALSE

data6

TEXT

TEXT

0

FALSE

data7

TEXT

TEXT

0

FALSE

data8

TEXT

TEXT

0

FALSE

data9

TEXT

TEXT

0

FALSE

data10

TEXT

TEXT

0

FALSE

data11

TEXT

TEXT

0

FALSE

data12

TEXT

TEXT

0

FALSE

data13

TEXT

TEXT

0

FALSE

data14

TEXT

TEXT

0

FALSE

data15

TEXT

TEXT

0

FALSE

data_sync1

TEXT

TEXT

0

FALSE

data_sync2

TEXT

TEXT

0

FALSE

data_sync3

TEXT

TEXT

0

FALSE

data_sync4

TEXT

TEXT

0

FALSE

resource

INTEGER

INTEGER

0

TRUE

0

mimetype_id:该项是来区分该列中保存的是姓名,还是email,还是电话号码

_id

类型

mimetype

1

email

vnd.android.cursor.item/email_v2

2

聊天账户(qq,Aim等)

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

raw_contact_id:对应raw_contacts中的id

is_super_primary:比如说如果有多个电话号码,该项是否是默认值

3.4   表之间的关系

4   联系人中的数据操作流程

以主界面的DefaultContactBrowseListFragment为例,继承关系如图

继承自ContactEntryListFragment的List界面的数据加载流程如下:

在Fragment中通过LoaderManager来对CursorLoader的创建和管理,Fragment中持有一个ContactEntryListAdapter对象,CursorLoader的参数配置等都放在ContactEntryListAdapter中处理,CursorLoader数据加载完成之后回调到Fragment中来,然后通过ContactEntryListAdapter来控制数据的刷新,以及UI的控制

DefaultContactBrowseListFragment对应的Adapter为DefaultContactListAdapter,对应的CursorLoader为ProfileAndContactsLoader

其他操作

对于联系人的创建、更新、删除一般情况下都封装在ContactSaveService类中,如图:

ContactSaveService类继承自IntentService,是一个用于异步操作联系人数据的service,在完成数据操作之后,通过请求操作的时候传递来Intent(Intent中包含需要回调的Activity和Action)回调到Activity中来通知UIThread进行UI update

以create contact为例:

ContactEditorFragment.sava()方法中

ContactSaveService中createSaveContactIntent(),传递了回调需要的参数

ContactSaveService中saveContact()中

能够回调到Activity是因为,Contact中有关联系人操作的Activity的基类ContactsActivity实现了ContactSaveService.Listener,然后在onCreate中ContactSaveService.registerListener(this),然后通过上面的代码逻辑最终会调用到

5   联系人UI 分析

这里主要看下编辑界面的UI,这里比较有特点,不同于其他UI界面.

编辑界面在ContactEditorActivity –> ContactEditorFragment中,编辑界面的UI,是一个自定义的RawContactEditorView,下面是数据传递和绑定的流程图

Fragment中持有自定义view对象RawContactEditorView和数据对象RawContactDeltaList,从数据库中查询出数据Contact之后,讲数据封装到RawContactDeltaList中,然后通过bindeditors、editor.setState方法将RawContactDeltaList数据传递给自定义view,然后RawContactEditorView将会将数据拆分,然后传递各个子view,同时也将RawContactDeltaList传递过去,然后数据更新就会在子view中完成,当Fragment中需要保存联系人的时候,就可以直接使用RawContactDeltaList,保存联系人的操作和上面的数据交互流程类似。

怎么删除starred in android这个联系人分组,联系人总结相关推荐

  1. android 仿qq好友列表分组效果及联系人分组效果

     历史记录仿QQ好友列表的动态效果 以及联系人的分组效果 QQ朋友分组的功能做的不错,大家都很认可,那么到底他的分组并且滑动的时候,标题能停留在顶部是如何实现的呢?今天从网上搜索了一下资料,自己运行了 ...

  2. Android通讯录管理 获取联系人 通话记录 短信消息 一

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Andr ...

  3. Android仿微信添加联系人列表,内附有截图和demo源码

    最新demo地址,仿微信添加联系人WXAddPersonDemo 分享一个Android仿微信选择联系人页面 之前做的App主要是工具类的,而且公司的产品经理也喜欢在App里设计很多自定义控件,所以比 ...

  4. android负责sim卡的应用,android读取sim卡联系人

    SIM的provider是IccProvider.既然是provider,就和操作Contact的provider类似的,只是有一些微小差别. IccProvider的Uri是content://ic ...

  5. 基于android手机群删联系人模块的设计与实现 论文,基于Android手机群删联系人模块的设计与实现...

    摘要: 随着移动互联网技术的发展,手机作为我们日常生活中最常用到的通讯设备,在功能上也是越来越强大.由于Android操作系统平台有良好的便捷性和开放性,使得Android操作系统手机越来越受到大家的 ...

  6. android qq分组展开,Android仿qq分组管理的第三方库

    本文实例为大家分享了Android仿qq分组管理的第三方库,供大家参考,具体内容如下 下面先看效果 我们点击展开与折叠分组的功能在库里面是已经封装好的,只能把它已入到项目中,就可以直接用了,十分的方便 ...

  7. android通讯录管理(获取联系人,通话记录,短信消息),Android通讯录管理(获取联系人、通话记录、短信消息)(二)...

    Android通讯录管理(获取联系人.通话记录.短信消息)(二) 前言:上一篇博客介绍的是获取联系人的实现,本篇博客将介绍通话记录的实现. 界面布局: /Contact_Demo/res/layout ...

  8. IM实现联系人及联系人分组的数据库设计

    openfire中通过ofgroup/ofgroupprop/ofgroupuser实现组织结构中的分组,通过ofroster/ofrostergroups实现好友关系中的分组.但是呢,我们做二次开发 ...

  9. Android向通讯录添加联系人的一般方法

     Android向通讯录添加联系人的一般方法 以一个简单的例子加以说明,记得需要相应的权限: <uses-permission android:name="android.perm ...

最新文章

  1. 双系统如何删除Linux
  2. 【Paddy】数据库监控系列(一) - 监控理念
  3. 关于spring-mvc.xml的mvc:resources元素浅析。
  4. 停课不停学,优酷直播如何将网课点名延迟降到0.6s?
  5. Tomcat5.5报错:Apache Portable Runtime was not found
  6. nio~view buffer
  7. IBM 的大型机 z Systems 引入 Go 语言
  8. 修改手机屏幕刷新率_手机屏幕没有高刷新率算不上旗舰机?看看网友都是如何回答的...
  9. python max((1、2、3)*2)_Python functional.max_pool2d方法代码示例
  10. Swift4.0复习协议
  11. rem单位中html默认字号,轻松掌握CSS3中的字体大小单位rem的使用方法
  12. 云计算 码率适配限速_5G 成熟后,带宽足够且云计算力够大,会不会对 PC 的升级需求放缓?...
  13. Hybrid和Tagged Untagged理解
  14. 《机器学习基石》笔记:第一讲
  15. Napatech网络加速卡
  16. 微软Azure 虚拟机支持多种 Linux 发行版!
  17. matlab rloess,比较ggplot loess拟合和loess拟合函数
  18. 图片记录:2008年12月4日夜晚,暴风雪突袭烟台-上
  19. C++小白如何做简单游戏
  20. 没有专业技能不要紧,通过快营通也能月入上千元

热门文章

  1. java实现复制excel模板(多个工作表)并下载的代码
  2. 二叉树层序遍历——java
  3. Programming with Multiple Paradigms in Lua(Object-Oriented Programming)
  4. 【二】2D测量 Metrology——add_metrology_object_generic()算子
  5. 随感20221227
  6. 第10章信源编码思考题
  7. 复试线388分!中科大软院公布考研分数线!
  8. Godaddy主机导入MSSQL数据库教程
  9. Sizes of tensors must match except in dimension 1. Got 61 and 60 in dimension 2
  10. 计算机行业岗位排名,全国“最缺工”100个职业排行,这些专业就业率高,发展前景好...