一.Content Provider的概念介绍

Content Providers是所有应用程序之间数据存储和检索的桥梁,它使得各个应用程序之间实现数据共享。是应用程序间共享数据的唯一途径。Content Provider 主要的功能就是存储并检索数据以及向其他应用程序提供访问数据的接口。其中包括添加,删除,查询,更新等操作。

在Content Provider使用过程中,还需要借用ContentResolver对象间接来操作ContentProvider来获取数据。ContentResolver通过应用程序的getContentResolver()方法获得。一般情况下,ContentResolver是单实例的,但是可以有多个ContentResolver在不用的应用程序和不同的进程之间和ContentResolver交互。

二.Content Provider的简介

1.Content Provider的常用方法

  1. //查询  
  2. query(Uri, String[], String, String[], String);  
  3. //插入  
  4. insert(Uri, ContentValues);  
  5. //更新  
  6. update(Uri, ContentValues, String, String[]);   
  7. //删除  
  8. delete(Uri, String, String[]);  
  9. //获得MIME数据类型  
  10. getType(Uri); 

2.数据模型

Content Provider 将其存储的数据以数据表的形式提供给访问者,在数据表中每一行为一条记录,每一列为具有特定类型和意义的数据。每一条数据记录都包括一个 "_ID" 数值字段,改字段唯一标识一条数据。

_ID

NUMBER

NUMBER_KEY

LABEL

NAME

TYPE

13

(425) 555 6677

425 555 6677

Kirkland office

Bully Pulpit

TYPE_WORK

44

(212) 555-1234

212 555 1234

NY apartment

Alan Vain

TYPE_HOME

45

(212) 555-6657

212 555 6657

Downtown office

Alan Vain

TYPE_MOBILE

53

201.555.4433

201 555 4433

Love Nest

Rex Cars

TYPE_HOME

3.URI

URI,每一个Content Provider 都对外提供一个能够唯一标识自己数据集(data set)的URI, 如果一个Content Provider管理多个数据集,其将会为每个数据集分配一个独立的URI。Content Provider就是通过URI对象来共享其数据的。

URI的格式图如下:

 各个部分的组成:

A:标准前缀,是固定的,"content://"是用来标识数据是由Content Provider管理的 schema。

B:URI的标识,它定义了是哪个Content Provider提供这些数据。对于第三方应用程序,为了保证URI标识的唯一性,它必须是一个完整的、小写的类名。这个标识在 元素的 authorities属性中说明:一般是定义该ContentProvider的包.类的名称

C:需要访问的数据字段名称。

D:如果URI中包含表示需要获取的记录的_ID;如何有D部分,则就返回该_ID对应的数据,否则表示返回整张表的数据 

三.Content Provider实例

Anroid系统自带的Content Provider对象

获得系统联系人信息(姓名和手机号码)的例子

MainActivity.java

  1. package com.lingdududu.provide;  
  2.  
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.provider.ContactsContract;  
  6. import android.provider.ContactsContract.PhoneLookup;  
  7. import android.database.Cursor;  
  8. import android.graphics.Color;  
  9. import android.widget.TextView;  
  10. import android.content.ContentResolver;  
  11.  
  12. public class MainActivity extends Activity {  
  13.     public void onCreate(Bundle savedInstanceState) {  
  14.               
  15.         super.onCreate(savedInstanceState);  
  16.         TextView tv = new TextView(this);  
  17.         String string = getQueryData();  
  18.         // 设置文本的颜色  
  19.         tv.setTextColor(Color.BLUE);  
  20.         // 设置TextView显示的内容  
  21.         tv.setText(string);  
  22.         //设置文本字体的大小  
  23.         tv.setTextSize(30.0f);  
  24.         // 显示到屏幕  
  25.         setContentView(tv);  
  26.     }  
  27.           
  28.     public String getQueryData(){  
  29.       
  30.         String string = "";  
  31.         // 得到ContentResolver对象  
  32.         ContentResolver cr = getContentResolver();  
  33.         // 取得电话本中开始一项的光标  
  34.         Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null,  
  35.                 nullnullnull);  
  36.         // 向下移动光标  
  37.         while (cursor.moveToNext()) {  
  38.             // 取得联系人名字  
  39.             int nameFieldColumnIndex = cursor  
  40.                     .getColumnIndex(PhoneLookup.DISPLAY_NAME);  
  41.             String contact = cursor.getString(nameFieldColumnIndex);  
  42.             // 取得电话号码  
  43.             String ContactId = cursor.getString(cursor  
  44.                     .getColumnIndex(ContactsContract.Contacts._ID));  
  45.             Cursor phone = cr.query(  
  46.                     ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,  
  47.                     ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" 
  48.                             + ContactId, nullnull);  
  49.             while (phone.moveToNext()) {  
  50.                 String PhoneNumber = phone  
  51.                         .getString(phone  
  52.                                 .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));  
  53.                 string += (contact + ":" + PhoneNumber + "\n");  
  54.             }  
  55.         }  
  56.         cursor.close();  
  57.         return string;        
  58.     }  

注意:记得在AndroidManifest.xml加上17行的权限声明

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
  3.       package="com.lingdududu.provide" 
  4.       android:versionCode="1" 
  5.       android:versionName="1.0"> 
  6.     <uses-sdk android:minSdkVersion="10" /> 
  7.  
  8.     <application android:icon="@drawable/icon" android:label="@string/app_name"> 
  9.         <activity android:name=".MainActivity" 
  10.                   android:label="@string/app_name"> 
  11.             <intent-filter> 
  12.                 <action android:name="android.intent.action.MAIN" /> 
  13.                 <category android:name="android.intent.category.LAUNCHER" /> 
  14.             </intent-filter> 
  15.         </activity> 
  16.     </application> 
  17.     <uses-permission android:name="android.permission.READ_CONTACTS"/>     
  18. </manifest> 

通讯录中联系人的信息:

效果图: