理清contactsprovider
android的联系人数据单独拿出来做成ContactsProvider,众多的table和view整体看下来,使得联系人的数据错综复杂。但是我们在开发的过程并不需要将所有的table都搞清楚。用到最多的是 ContactsContract.Contacts、ContactsContract.RawContacts、ContactsContract.Data这三张表格。
先预览一下,一个联系人数据的存储结构:
可以很直观的看出。一个联系人在contacts2.db中(除了profile.db中的自己外),数据基本存放在3张表中,在ContactsContract.Contacts中会存在一条记录,在ContactsContract.RawContacts中可能存在多个记录,ContactsContract.Data中的数据是对ContactsContract.RawContacts的详细描述。
_id |
starred |
lookup |
photo_id |
1 |
0 |
... |
<null> |
2 |
0 |
... |
<null> |
4 |
1 |
... |
1 |
ContactsContract.RawContacts的表格结构大致如下,它里面的记录主要是针对特定账户下的联系人数据的描述(data表中的数据)。这边的contact_id对应的是contacts表中的_id,一个联系人在raw_contacts表格中可能存在一条以上的记录,这主要是由于caccount_name和account_type不同造成的。
这边需要用一个例子来帮助理解:
假设我在我的手机上有三个账户 gaojian@gmail.com、gaojian3301@gmail.com,这两个账户的“同步联系人”都被check上,当我添加一个联系人到手机里时,这个联系人会同时被备份到这个两个账户中去,所以这两个记录在raw_contacts表格中的contact_id会一样。
_id |
contact_id |
account_name |
account_type |
deleted |
1 |
1 |
gaojian@gmail.com |
com.google |
1 |
2 |
1 |
gaojian1305039@163.com |
163.com |
0 |
data表格中记录的数据是对raw_contacts中数据的详细描述。这边的data1存储的值就是联系人在搜索时会search的值;data15用来存储一些比较大的二进制对象,比如说联系人的头像缩略图。
这一边需要注意一个事情:在我们开发或者测试的过程中,不要将与MMIETYPE格式不匹配的数据存入data中(比如将email的值设置为1233445),这可能会造成data数据的丢失,更甚者会导致provider出问题(这个我猜测比如在发送Email的时候,去选择contacts,返回值可能会有问题,没有验证过)。
_id |
raw_contact_id |
mimetype_id |
data1 |
data2 |
data15 |
1 |
1 |
6 |
<null> |
||
2 |
1 |
5 |
110 |
1 |
<null> |
3 |
3 |
6 |
gaojian |
gao |
<null> |
总结一下,我们可以从contacts中找到我们想要看的联系人,在raw_contacts中可以看到的是这个联系人一些数据的基本描述,而data提供给我们的是这个联系人所有的具体信息。这三张表格就是在平时开发中,打交道最多的表格。当然,如果要获取和修改群组的信息,那么还会接触到group这张表格;而筛选的表格对应的是search_index。
放一张android官方api的图做个了断:
理清contactsprovider相关推荐
- 带你理清Node.js 的Web框架的3个层次
web 框架指的是处理 http.https 的服务端框架,Node.js 提供了 http.https 模块用于处理协议数据,这是 web 框架的基础. 但是 http.https 的 api 过于 ...
- java websocket_理清 WebSocket 和 HTTP 的关系
问题一 问题二 最后 <Netty 实现原理与源码解析 -- 精品合集> <Spring 实现原理与源码解析 -- 精品合集> <MyBatis 实现原理与源码解析 -- ...
- 你需要的不是重构,而是理清业务逻辑(转)
最近我遇到了一位以前公司的同事.他提到了数年前我在那个公司曾经开发过的项目.他说这个项目现在已经变成了"职业杀手".基本上,任何接触过这个 "职业杀手"项目的人 ...
- 理清 WebSocket 和 HTTP 的关系
最近公司内部同事分享了WebSocket相关的一些知识,之前也用过WebSocket做过一个即时通信的应用.基本上但凡提到WebSocket和HTTP的关系都会有以下两条: WebSocket和HTT ...
- 帮你理清 SpringBoot 与 SpringMVC 的关系
spring boot就是一个大框架里面包含了许许多多的东西,其中spring就是最核心的内容之一,当然就包含spring mvc.spring mvc 只是spring 处理web层请求的一个模块. ...
- AI:几张图理清人工智能与机器学习、知识发现、数据挖掘、统计学、模式识别、神经计算学、数据库之间的暧昧关系
AI:几张图理清人工智能与机器学习.知识发现.数据挖掘.统计学.模式识别.神经计算学.数据库之间的暧昧关系 目录 几张图理清人工智能与机器学习.知识发现.数据挖掘.统计学.模式识别.神经计算学.数据库 ...
- 科普文丨Java 单元测试相关概念理清
对于从业Java的小伙伴来说,"单元测试"这个词你一定不陌生,如果你想要学习 Java 单元测试,下面的内容你一定要看! 近日,实验楼上线了新课<Java 单元测试入门实战& ...
- 教你理清SpringBoot与SpringMVC的关系
spring boot就是一个大框架里面包含了许许多多的东西,其中spring就是最核心的内容之一,当然就包含spring mvc.spring mvc 是只是spring 处理web层请求的一个模块 ...
- 从部署 httpd 入手,理清 k8s 配置中的 containerPort、port、nodePort、targetPort
注:文中各种内网.公网 IP 仅为示例,不保证所有 IP 都可以访问,且你的环境中 IP 可能不同. 背景 在上一篇文章 自己搭建一个k8s环境 中,我们一顿操作猛如虎,搭建出了由 1 个 maste ...
- 彻底理清重载函数匹配
前言 前面我们讲到了<什么是函数重载?>,有了函数重载之后,就需要确定某次调用需要选用哪个函数.这个过程可以称之为函数匹配或者重载确定.大多数情况下,我们都很容易能够确定某次调用需要选用哪 ...
最新文章
- jsp 环境配置记录
- mysql 赋权_Mysql赋权
- 阿里云 rds 在windows 里面恢复
- BackgroundWorker
- 解决Spring Boot报错Mapped Statements collection already contains value for...Error while adding the mapp
- C4.5-Release8中Ross Quinlan对缺失值的处理
- SAP UI5 Repository and MongoDB Repository
- filter动态参数 maven_使用Profile和Resources Filter隔离测试环境
- linux编译内核后无法进入,编译linux内核,ubuntu,x86的环境出现warning,然后就出现无法启动ubuntu...
- 数仓中长跳转问题复现及解决方案
- 都在说 AI 与云计算融合,AI 在云中的作用真有那么大吗?
- mysql错误Table ‘./mysql/proc’ is marked as crashed and should be repaired
- 如何在Ubuntu上安装MariaDB
- 线性代数(六)正交性
- 微信小程序登录注册界面
- 表格用计算机做成横版的WPS,WPS表格怎么将表格横过来图文教程
- 算法笔记:使用A*算法解决八数码问题
- postgresql 手动启动_PostGreSql 手动安装
- 6 客户端认证方式 之 client_secret_basic client_secret_post
- U盘安装kali linux