今日学习任务:实现读取手机中全部联系人的主要信息(名称和联系电话),并以ListView显示数据库
涉及的主要内容:1) Contact API的结构和使用方法 2) ContentProvider组件做用,URI概念及使用方法 3)建立ListView,并绑定数据网络
自Android 2.0(API Level 5)开始,Android平台采用了改进后的Contacts API- ContactsContract,用于管理和集成来自多帐户和多数据来源的联系人信息。ide
在新的Contacts API中,联系人数据被安排三个主要的表中:contacts, raw contacts and data. 结构以下图所示:函数
1) Contact 表中的一行记录表明一个联系人的整体信息学习
2) RawContact表的一行记录用于关联联系人和一个特定的联系人信息来源。由于有可能手机的联系人信息是来源于Gmail,Facebook等其它地方,为互相区别并方便同步,特引入RawContact概念。url
3) Data表:储存全部具体的信息,如:电话,email地址, 头像等。表的每一条记录对应一个RawContact的一个具体信息。blog
总的来讲就是:一个contact(联系人)记录关联一个或多个RawContact(联系人来源)记录,每一个RawContact记录又关联多个data(email, phone number等等)记录。接口
在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();