Android_ContentProvider详解(实现增删改查)

1.概述

ContentProvider为存储和读取数据提供了统一的接口,实现了程序间的数据共享,而应用程序内部没有必要实现这个功能,直接操作数据库就可以!Android内置的许多数据都是使用ContentProvider形式,供开发者调用的(如视频,音频,图片,通讯录等)。
当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据,统一了数据访问方式。

2.提供一个ContentProvider

/*
 * PersonProvider.java
 * 内容提供者
 */
public class PersonProvider extends ContentProvider {
	private SQLiteDatabase db;		//需要操作的数据库
	private final static int PERSON = 1;
	private final static int PERSONID = 2;
	private final static int DELPERSONID = 3;
	private final static int PERSONS = 4;
	//	1.定义一个静态常量字段Uri匹配器,用以匹配uri
	private final static UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH);	//如果都匹配不成功,则返回构造函数中指定的参数值,默认为-1
	//	2.静态代码块
	static{
		/*
		 * Add a URI to match, and the code to return when this URI is matched. 
		 * 使用"*"去匹配任意的文本数据,或者使用"#"去匹配任意的数字
		 * MATCHER.addURI(String authority, 	//	主机名或者认证 com.baidu.provider.person
		 * 					String path, 		//	路径 authority/path
		 * 					int code)			//	与这个authority的path路径想对应的,一个int的数字,使用MATCHER.match(uri) 返回code数字
		 */
		MATCHER.addURI("com.baidu.provider.person", "person", PERSON);	//
		MATCHER.addURI("com.baidu.provider.person", "persons", PERSONS);
		MATCHER.addURI("com.baidu.provider.person", "person/update/#", PERSONID);
		MATCHER.addURI("com.baidu.provider.person", "person/delete/#", DELPERSONID);
	}
	//	3.onCreate方法完成provider的初始化动作,主要是数据库的构建
	@Override
	public boolean onCreate() {
		DbOpenHelper dbOpenHelper = new DbOpenHelper(this.getContext());
		db = dbOpenHelper.getWritableDatabase();
		return true;
	}
	
	/*
	 *	4.覆写需要的方法
	 * 		query,insert,delete,update
	 */
	@Override
	public Uri insert(Uri uri, ContentValues values) {
		//4.1 使用uri匹配器去匹配一个uri,根据int返回值来判断具体的操作类型
		switch (MATCHER.match(uri)) {	
		case PERSON:
		//4.2与uri想匹配的响应操作
			long id = db.insert("person", "name", values);	//返回id
			uri = ContentUris.withAppendedId(uri, id);		//返回需求的uri
			break;
		default:
			break;
		}
		return uri;
	}
}
<!-- AndroidManifest.xml -->
<provider android:name=".PersonProvider" android:authorities="com.baidu.provider.person"></provider>

3.ContentProvider的增删改查

(1).增加操作

/*
 * 	ContentProvider 增操作
 */
// 提供者内部方法
public Uri insert(Uri uri, ContentValues values) {
	switch (MATCHER.match(uri)) {
	case PERSON:
		long id = db.insert("person", "name", values);
		uri = ContentUris.withAppendedId(uri, id);		//注意使用这个简便的操作方法,来生成一个uri
		break;
	default:
		break;
	}
	return uri;
}
// 使用提供者的内部方法
public void insertMethod(){
	ContentResolver resolver = MainActivity.this.getApplicationContext().getContentResolver();
	Uri uri = Uri.parse("content://com.baidu.provider.person/person");
	List<String> list = uri.getPathSegments();
	ContentValues values = new ContentValues();
	values.put("name", "zhang");
	values.put("age", "20");
	Uri resultUri = resolver.insert(uri, values);
	if(ContentUris.parseId(resultUri) > 0){		//根据uri,解析出其中的id值
		show("插入成功!");
	}else{
		show("插入失败!");
	}
}
public void show(String info){
	Toast.makeText(this, info, Toast.LENGTH_SHORT).show();
}

(2).删除操作

/*
 * 	ContentProvider 删操作
 */
// 提供者内部方法
public int delete(Uri uri, String selection, String[] selectionArgs) {
	int resultId = 0;
	switch (MATCHER.match(uri)) {
	case DELPERSONID:
		long id = ContentUris.parseId(uri);		//根据uri对象,解析出其中的id,解析失败返回为-1
		if(selection != null){
			selection += (" and _id="+id);
		}else{
			selection = ("_id="+id);
		}
		resultId = db.delete("person", selection, selectionArgs);	//返回删除成功的行号值
		break;
	}
	return resultId;
}
//使用提供者的内部方法
public void deleteMethod(){
	ContentResolver resolver = MainActivity.this.getApplicationContext().getContentResolver();
	Uri uri = Uri.parse("content://com.baidu.provider.person/person/delete/6");
	int id = resolver.delete(uri, null, null);
	if(id > 0){
		show("删除成功!");
	}else{
		show("删除失败!");
	}
}
public void show(String info){
	Toast.makeText(this, info, Toast.LENGTH_SHORT).show();
}

(3).更新操作

/*
 * 	ContentProvider 更新操作
 */
// 提供者内部方法
public int update(Uri uri, ContentValues values, String selection,
		String[] selectionArgs) {
	int resultId = 0;
	switch (MATCHER.match(uri)) {
	case PERSONID:
		long id = ContentUris.parseId(uri);
		if(selection != null){
			selection += (" and _id="+id);
		}else{
			selection = ("_id="+id);
		}
		resultId = db.update("person", values, selection, selectionArgs);
		break;
	default:
		break;
	}
	return resultId;
}
//使用提供者的内部方法
public void updateMethod(){
	ContentResolver resolver = MainActivity.this.getApplicationContext().getContentResolver();
	Uri uri = Uri.parse("content://com.baidu.provider.person/person/update/5");
	ContentValues values = new ContentValues();
	values.put("name", "li");
	values.put("age", "24");
	int id = resolver.update(uri, values, null, null);
	if(id > 0){
		show("更新成功!");
	}else{
		show("更新失败!");
	}
}
public void show(String info){
	Toast.makeText(this, info, Toast.LENGTH_SHORT).show();
}

(4).查询操作

/*
 * 	ContentProvider 查询操作
 */
// 提供者内部方法
public Cursor query(Uri uri, String[] projection, String selection,
		String[] selectionArgs, String sortOrder) {
	Cursor cursor = null;
	switch (MATCHER.match(uri)) {
	case PERSONS:
		cursor = db.query("person", projection, selection, selectionArgs, null, null, sortOrder);
		break;
	default:
		break;
	}
	return cursor;
}
//使用提供者的内部方法
ContentResolver resolver = MainActivity.this.getApplicationContext().getContentResolver();
Uri uri = Uri.parse("content://com.baidu.provider.persons");
Cursor cursor = resolver.query(uri, null, null, null, null);
if(cursor != null){
	list.setAdapter(new SimpleCursorAdapter(MainActivity.this, R.layout.item, cursor, new String[]{"_id", "name", "age"}, new int[]{R.id.id, R.id.name, R.id.age}));
	show("查询成功!");
}else{
	show("查询失败!");
}
public void show(String info){
	Toast.makeText(this, info, Toast.LENGTH_SHORT).show();
}

4.内容观察者

在listView中,使用内容提供者动态更新数据
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://sms/");
resolver.registerContentObserver(uri, true, new ContentObserver(new Handler()) {
	@Override
	public void onChange(boolean selfChange) {
		super.onChange(selfChange);
		/*
		 * 发送一个Message对象
		 * 有handler对对象进行处理
		 */
	}
});

5.操作示意图

                

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值