Content Provider屬於Android應用程序的組件之一,作為應用程序之間唯一的共享數據的途徑,Content Provider主要的功能就是存儲並檢索數據以及向其他應用程序提供訪問數據的借口。本節主要講解Content Provider的概念及使用。
一、Content Provider簡介
我們說Android應用程序的四個核心組件是:Activity、Service、Broadcast Receiver和Content Provider。在Android中,應用程序彼此之間相互獨立的,它們都運行在自己獨立的虛擬機中。Content Provider 提供了程序之間共享數據的方法,一個程序可以使用Content Provider 定義一個URI,提供統一的操作接口,其他程序可以通過此URI訪問指定的數據,進行數據的增、刪、改、查。
二、Content Provider的使用
我們舉一個讀取Android系統通訊錄提供的Content Provider為例,說明如何使用現成的Content Provider。
1、新建一個項目Lesson20_ContentProvider項目。
2、res/layout/main.xml內容省略,就是制作一個查詢按鈕。
3、MainContentProvider.java的內容如下:
Java代碼
- package android.basic.lesson20;
-
- import android.app.Activity;
- import android.content.ContentResolver;
- import android.content.ContentValues;
- import android.database.Cursor;
- import android.net.Uri;
- import android.os.Bundle;
- import android.provider.ContactsContract;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.Toast;
-
- public class MainContentProvider extends Activity {
-
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
-
- Button b1 = (Button) findViewById(R.id.Button01);
-
- OnClickListener ocl = new OnClickListener() {
-
- @Override
- public void onClick(View v) {
- ContentResolver contentResolver = getContentResolver();
- // 獲得所有的聯系人
- Cursor cursor = contentResolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
- // 循環遍歷
- if (cursor.moveToFirst()) {
-
- int idColumn = cursor.getColumnIndex(ContactsContract.Contacts._ID);
-
- int displayNameColumn = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
-
- do {
- // 獲得聯系人的ID號
- String contactId = cursor.getString(idColumn);
-
- // 獲得聯系人姓名
- String disPlayName = cursor.getString(displayNameColumn);
-
- Toast.makeText(MainContentProvider.this, "聯系人姓名:"+disPlayName,
- Toast.LENGTH_LONG).show();
-
- // 查看該聯系人有多少個電話號碼。如果沒有這返回值為0
- int phoneCount = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
-
- if (phoneCount > 0) {
-
- // 獲得聯系人的電話號碼列表
- Cursor phonesCursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,
- ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null);
-
- if (phonesCursor.moveToFirst()) {
- do {
- // 遍歷所有的電話號碼
- String phoneNumber = phonesCursor.getString(phonesCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
- Toast.makeText(MainContentProvider.this, "聯系人電話:"+phoneNumber,Toast.LENGTH_LONG).show();
- } while (phonesCursor.moveToNext());
- }
- }
-
- } while (cursor.moveToNext());
- }
- }
- };
-
- b1.setOnClickListener(ocl);
- }
-
- }
4、運行程序,查看結果
系統通訊錄中的聯系人信息如下圖:
我們的程序讀取出來的聯系人信息: