一、概述

ContentProvider是四大应用组件之一

当前应用使用ContentProvider将数据库表数据操作暴露给其它应用访问

其它应用需要使用ContentResolver来调用ContentProvider的方法

它们之间的调用是通过Uri来进行交流的

二、相关API

1.内容提供者类

//provider对象创建后调用(应用安装成功或手机启动完成)
public abstract boolean onCreate();

//查询表数据
Cursor query(Uri uri, String[] projection,String selection, String[] selectionArgs)

//插入表数据
Uri insert(Uri uri, ContentValues values);

//删除表数据
int delete(Uri uri, String selection, String[] selectionArgs)

//更新表数据
update(Uri uri, ContentValues values, String selection,String[] selectionArgs);

2.ContentResolver:  内容提供者的解析类

//得到它的对象
context.getContentResolver() 

//调用provider进行数据库CRUD操作
Insert()、delete()、update()、query()

//注册uri的监听
registerContentObserver(Uri uri, boolean notify,ContentObserver observer)

//解注册uri的监听
unregisterContentObserver(ContentObserver observer)

//通知监听器
notifyChange(Uri uri, ContentObserver observer)
3.Uri: 包含请求地址数据的类

//得到其对象
Uri static parse(String uriString)


A : 是一个前缀,表示是由ContentProvider提供,固定不变
B : authority, 标识是哪个Provider,不同的Provider此部分必须不同。
C : 对应于哪张表 student
D : id值, 对应表中的哪条记录

4.UriMatcher : 用于匹配Uri的容器

//添加一个合法的URI
void addURI(String authority, String path, int code) 

//匹配指定的uri, 返回匹配码
int match(Uri uri) 


5.ContentUris : 解析uri的工具类

//解析uri, 得到其中的id
long parseId(Uri contentUri) 

//添加id到指定的uri中
Uri withAppendedId(Uri contentUri, long id) 
三、代码实现

1.编写ContentProvider子类

package com.example.provider;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.util.Log;

/**
 * 操作person表的provider类
 * 
 * @author Xiaocici
 *
 */
public class PersonProvider extends ContentProvider {

	// 用来存放所有合法的Uri的容器
	private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
	// 保存一些合法的uri
	// content://com.example.provider.personprovider/person 不根据id操作
	// content://com.example.provider.personprovider/person/3 根据id操作
	static {
		matcher.addURI("com.example.provider.personprovider", "/person", 1);
		matcher.addURI("com.example.provider.personprovider", "/person/#", 2);// #匹配任意数字
	}

	private DBHelper dbHelper;

	public PersonProvider() {
		Log.e("TAG", "PersonProvider()");
	}

	@Override
	public boolean onCreate() {
		Log.e("TAG", "onCreate()");
		dbHelper = new DBHelper(getContext());
		return false;
	}

	/**
	 * content://com.example.provider.personprovider/person 不根据id查询
	 * content://com.example.provider.personprovider/person/3 根据id查询
	 */
	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		Log.e("TAG", "query()");

		// 得到连接对象
		SQLiteDatabase database = dbHelper.getReadableDatabase();
		// 1.匹配uri,返回code
		int code = matcher.match(uri);
		// 如果合法,进行查询
		if (code == 1) {// 不根据id查询
			Cursor cursor = database.query("person", projection, selection,
					selectionArgs, null, null, null);
			return cursor;
		} else if (code == 2) {// 根据id查询
			// 得到id
			long id = ContentUris.parseId(uri);
			// 查询
			Cursor cursor = database.query("person", projection, "_id=?",
					new String[] { id + "" }, null, null, null);
			return cursor;
		} else {// 如果不合法,抛出异常
			throw new RuntimeException("查询的uri不合法");
		}
	}

	@Override
	public String getType(Uri uri) {
		Log.e("TAG", "getType()");
		return null;
	}

	/**
	 * content://com.example.provider.personprovider/person 插入
	 */
	@Override
	public Uri insert(Uri uri, ContentValues values) {
		Log.e("TAG", "insert()");
		// 得到连接对象
		SQLiteDatabase database = dbHelper.getReadableDatabase();
		// 匹配uri,返回code
		int code = matcher.match(uri);
		// 如果合法,进行插入
		if (code == 1) {
			long id = database.insert("person", null, values);
			//将id添加到uri中
			uri = ContentUris.withAppendedId(uri, id);
			database.close();
			return uri;
		} else {// 如果不合法,抛出异常
			database.close();
			throw new RuntimeException("插入的uri不合法");
		}
	}

	/**
	 * content://com.example.provider.personprovider/person 不根据id删除
	 * content://com.example.provider.personprovider/person/3 根据id删除
	 */
	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		Log.e("TAG", "delete()");
		// 得到连接对象
		SQLiteDatabase database = dbHelper.getReadableDatabase();
		// 匹配uri,返回code
		int code = matcher.match(uri);
		int deleteCount = -1;
		// 如果合法,进行删除
		if (code == 1) {
			deleteCount = database.delete("person", selection, selectionArgs);
		}else if(code ==2){
			long id = ContentUris.parseId(uri);
			deleteCount = database.delete("person", "_id="+id, null);
		}else{// 如果不合法,抛出异常
			database.close();
			throw new RuntimeException("删除的uri不合法");
		}
		database.close();
		return deleteCount;
	}

	/**
	 * content://com.example.provider.personprovider/person 不根据id更新
	 * content://com.example.provider.personprovider/person/3  根据id更新
	 */
	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
		Log.e("TAG", "update()");
		// 得到连接对象
		SQLiteDatabase database = dbHelper.getReadableDatabase();
		// 匹配uri,返回code
		int code = matcher.match(uri);
		int updateCount = -1;
		// 如果合法,进行更新
		if (code == 1) {
			updateCount = database.update("person", values, selection, selectionArgs);
		}else if(code ==2){
			long id = ContentUris.parseId(uri);
			updateCount = database.update("person", values, "_id="+id, null);
		}else{// 如果不合法,抛出异常
			database.close();
			throw new RuntimeException("更新的uri不合法");
		}
		database.close();
		return updateCount;
	}

}
2.在manifest.xml中注册

<span style="white-space:pre">	</span><provider android:name="com.example.provider.PersonProvider"
            android:exported="true"
            android:authorities="com.example.provider.personprovider"/>
        <!-- exported :是否可以让其它应用访问 -->
3.得到其对象

ContentResolver resolver = getContentResolver();
4.使用其对象

inert()、delete()、update()和query()
	系统自动找到匹配的ContentProvider对象来操作数据

registerContentObserver(Uri uri, boolean notify,ContentObserver observer)
	注册uri的监听

unregisterContentObserver(ContentObserver observer)
	解注册uri的监听

notifyChange(Uri uri, ContentObserver observer)
	通知监听器


package com.example.resolver;

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.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}
	
	/*
	 * 通过ContentResolver调用ContentProvider插入一条记录
	 */
	public void insert(View v){
		//1.得到ContentResolver对象
		ContentResolver resolver = getContentResolver();
		//2.调用其insert
		Uri uri = Uri.parse("content://com.example.provider.personprovider/person/");
		ContentValues values = new ContentValues();
		values.put("name", "Jack");
		Uri insert = resolver.insert(uri, values);
		Toast.makeText(this,insert.toString(), 1).show();
	}
	
	/*
	 * 通过ContentResolver调用ContentProvider更新一条记录
	 */
	public void update(View v){
		//1.得到ContentResolver对象
		ContentResolver resolver = getContentResolver();
		//2.执行update
		Uri uri = Uri.parse("content://com.example.provider.personprovider/person/2");
		ContentValues values = new ContentValues();
		values.put("name", "Jack2");
		int updateCount = resolver.update(uri, values, null, null);
		Toast.makeText(this,"updateCount="+updateCount, 1).show();
	}
	
	/*
	 * 通过ContentResolver调用ContentProvider删除一条记录
	 */
	public void delete(View v){
		//1.得到ContentResolver对象
		ContentResolver resolver = getContentResolver();
		//2.执行delete
		Uri uri = Uri.parse("content://com.example.provider.personprovider/person/2");
		
		int deleteCount = resolver.delete(uri, null, null);
		Toast.makeText(this,"deleteCount="+deleteCount, 1).show();
	}
	
	/*
	 * 通过ContentResolver调用ContentProvider查询所有记录
	 */
	public void query(View v){
		//1.得到ContentResolver对象
		ContentResolver resolver = getContentResolver();
		//2.调用其query,得到cursor
		Uri uri = Uri.parse("content://com.example.provider.personprovider/person/");
		Cursor cursor = resolver.query(uri, null, null, null, null);
		//3.取出cursor中的数据,并显示
		while(cursor.moveToNext()){
			int id = cursor.getInt(0);
			String name = cursor.getString(1);
			Toast.makeText(this, id+":"+name, 0).show();
		}
		cursor.close();
	}
}
5.数据库操作

package com.example.provider;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DBHelper extends SQLiteOpenHelper {

	public DBHelper(Context context) {
		super(context, "atschool.db", null, 1);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		Log.e("TAG", "onCreate()");
		//建表
		db.execSQL("create table person(_id integer primary key autoincrement,name varchar)");
		//插入初始化数据
		db.execSQL("insert into person (name) values ('TOM')");
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// TODO Auto-generated method stub

	}

}







Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐