文档章节

关于Android中Contact API的讲解

 大爱rails
发布于 2013/07/04 12:23
字数 1598
阅读 365
收藏 11

今日学习任务:实现读取手机中所有联系人的主要信息(名称和联系电话),并以ListView显示

涉及的主要内容:1) Contact API的结构和使用方法 2) ContentProvider组件作用,URI概念及使用方法 3)创建ListView,并绑定数据

  1. Contact API的结构和使用方法

自Android 2.0(API Level 5)开始,Android平台采用了改进后的Contacts API- ContactsContract,用于管理和集成来自多账户和多数据来源的联系人信息。

在新的Contacts API中,联系人数据被安排三个主要的表中:contacts, raw contacts and data. 结构如下图所示:

在此输入图片描述

1) Contact 表中的一行记录代表一个联系人的总体信息

2) RawContact表的一行记录用于关联联系人和一个特定的联系人信息来源。因为有可能手机的联系人信息是来源于Gmail,Facebook等其它地方,为互相区别并方便同步,特引入RawContact概念。

3) Data表:储存所有具体的信息,如:电话,email地址, 头像等。表的每一条记录对应一个RawContact的一个具体信息。

总的来说就是:一个contact(联系人)记录关联一个或多个RawContact(联系人来源)记录,每个RawContact记录又关联多个data(email, phone number等等)记录。

  1. ContentProvider组件作用,URI概念及使用方法

在Android中,应用程序之间是相互独立的,分别运行在自己的进程中。如果应用程序之间想互相共享数据怎么办?比如,当我们发送一条短信时,可能要用到联系人应用程序,从中选择要接受短信的人。在这种情况下,Android提供了应用程序之间互相访问的统一接口,这些接口被定义在ContentProvider中,其中包括增,删,查,改等操作。

我们在ContentProvider中实现我们实际操作数据的方法。但调用时,我们将使用另外一个接口:ContentResolver。ContentResolver提供了和ContentProvider对应的方法。我们是间接地通过ContentResolver来操作ContentProvider的。ContentResolver可以通过getContentResolver()方法获得。

Android 应用程序之间数据共享—ContentResolver

Android是如何实现应用程序之间数据共享的?一个应用程序可以将自己的数据完全暴露出去,外界更本看不到,也不用看到这个应用程序暴露的数据 是如何存储的,或者是使用数据库还是使用文件,还是通过网上获得,这些一切都不重要,重要的是外界可以通过这一套标准及统一的接口和这个程序里的数据打交 道,例如:添加(insert)、删除(delete)、查询(query)、修改(update),当然需要一定的权限才可以。

如何将应用程序的数据暴露出去? Android提供了ContentProvider,一个程序可以通过实现一个Content provider的抽象接口将自己的数据完全暴露出去,而且Content providers是以类似数据库中表的方式将数据暴露。Content providers存储和检索数据,通过它可以让所有的应用程序访问到,这也是应用程序之间唯一共享数据的方法。要想使应用程序的数据公开化,可通过2种 方法:创建一个属于你自己的Content provider或者将你的数据添加到一个已经存在的Content provider中,前提是有相同数据类型并且有写入Content provider的权限。

如何通过一套标准及统一的接口获取其他应用程序暴露的数据?Android提供了ContentResolver,外界的程序可以通过ContentResolver接口访问ContentProvider提供的数据。

当前篇主要说明,如何获取其它应用程序共享的数据,比如获取Android 手机电话薄中的信息。 什么是URI?

在学习如何获取ContentResolver前,有个名词是必须了解的:URI。URI是网络资源的定义,在Android中赋予其更广阔的含义,先看个例子,如下: URI 将其分为A,B,C,D 4个部分: A:标准前缀,用来说明一个Content Provider控制这些数据,无法改变的; B:URI的标识,它定义了是哪个Content Provider提供这些数据。对于第三方应用程序,为了保证URI标识的唯一性,它必须是一个完整的、小写的 类名。这个标识在<provider> 元素的 authorities属性中说明: <provider name=”.TransportationProvider” authorities=”com.example.transportationprovider” . . . > C:路径,Content Provider使用这些路径来确定当前需要生什么类型的数据,URI中可能不包括路径,也可能包括多个; D:如果URI中包含,表示需要获取的记录的ID;如果没有ID,就表示返回全部; 由于URI通常比较长,而且有时候容易出错,切难以理解。所以,在Android当中定义了一些辅助类,并且定义了一些常量来代替这些长字符串,例如:People.CONTENT_URI ContentResolver 介绍说明

看完这些介绍,大家一定就明白了,ContentResolver是通过URI来查询ContentProvider中提供的数据。除了URI以 外,还必须知道需要获取的数据段的名称,以及此数据段的数据类型。如果你需要获取一个特定的记录,你就必须知道当前记录的ID,也就是URI中D部分。

前面也提到了Content providers是以类似数据库中表的方式将数据暴露出去,那么ContentResolver也将采用类似数据库的操作来从Content providers中获取数据。现在简要介绍ContentResolver的主要接口,如下: 返回值 函数声明 final Uri insert(Uri url, ContentValues values)Inserts a row into a table at the given URL. final int delete(Uri url, String where, String[] selectionArgs)Deletes row(s) specified by a content URI. final Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)Query the given URI, returning a Cursor over the result set. final int update(Uri uri, ContentValues values, String where, String[] selectionArgs)Update row(s) in a content URI.

看到这里,是否感觉与数据库的操作基本一样的?就是这样的,详细解析请参考Android SQLite解析篇中的说明,不在此详细说明。

最后一个问题:如何获取ContentResolver?调用getContentResolver (),例如:ContentResolver cr = getContentResolver();

本文转载自:

粉丝 0
博文 1
码字总数 0
作品 0
大连
私信 提问
Android Activity---启动Activity

你能够通过调用startActivity()方法来启动另外一个Activity,在调用这个方法时要给它传递一个你想要启动的描述Activity的Intent作为参数。这个Intent既可以确切的指定你想要启动的Activity,...

长平狐
2012/10/16
2.1K
0
android基础知识05:四大组件之activity 02

本系列开始介绍activity的四大组件,主要是整理网络上关于这一部分的相关资料。包含如下三篇文章: android基础知识05:四大组件之activity 01:基础知识 android基础知识05:四大组件之act...

迷途d书童
2012/03/23
211
0
如何使得自己的代码被别人优雅引用:快速上传Android Library到Jcenter超详细教程

前言 在日常开发中,我们经常会通过 远程引用别人的代码()来实现一些功能,如引用 网络请求库 那么,该如何使得自己的代码()被别人优雅的引用呢? 答:将代码上传至到 ->> 别人再通过 引...

Carson_Ho
2018/09/03
0
0
Android:图文解析带你快速了解RxJava原理

前言 由于其基于事件流的链式调用、逻辑简洁 & 使用简单的特点,深受各大 开发者的欢迎。 如果还不了解RxJava,请看文章:Android:这是一篇 清晰 & 易懂的Rxjava 入门教程 今天,carson今天...

Carson_Ho
08/12
0
0
scaloid开发android

本篇文章被重新写了一遍,基本上一篇文章写完后,过20天后,就发现以前的观点站不住脚了。 scaloid强大的表现力 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"...

lost_o0
2014/06/23
604
3

没有更多内容

加载失败,请刷新页面

加载更多

 介绍一款优秀的通用管理权限快速开发框架

这是一套以权限管理为主的轻量化快速开发框架,配置有流程、专业表单、权限、app、企业微信等基础功能模块,在开发通用软件的效率上很有优势。 软件平台常用研发需求分析 《那些年我们一起做...

我想造火箭
35分钟前
10
0
ElasticDL:蚂蚁金服开源基于 TensorFlow 的弹性分布式深度学习系统

9 月 11 日,蚂蚁金服在2019谷歌开发者大会上海站上开源了 ElasticDL 项目,这是业界首个基于 TensorFlow 实现弹性深度学习的开源系统。 开源地址为:https://github.com/sql-machine-learni...

SOFAStack
42分钟前
11
0
CSS--渐变

一、什么是渐变 多种颜色平缓变化的一种显示效果 二、渐变的主要元素 色标:一种颜色,以及出现的位置,一个渐变至少两种色标 三、渐变的分类 1、线性渐变 以直线的方式来填充渐变色 backgr...

wytao1995
57分钟前
13
0
Java通过模板生成PDF再转换为图片

1、添加maven依赖 <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.13.1</version></dependency><dependency> <g......

醉美閑聖
今天
9
0
SpringBoot-MVC RequestBody中LocalDateTime的自适应配置

请求的json报文中可能会出现 一下几种: ['2019-01-01','2019-01-01 12:03:34','20190101120334'] 但是接收的Request实体类日期字段是LocalDateTime类型 LocalDateTime applyDate; 希望的情况......

汉堡OSC
今天
19
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部