ContentProvider的感想

  今天,接触到了ContentProvider,它作为Android的四大组件之一,有着它不可替代的作用。它就像经销商一样经营着手机中每个App的Sqlite数据库,可以让每个App互相获取其他App的数据,在一个App中要想注册一个ContentProvider,必须有一个类继承ContentProvider,并且实现当中的onCreate(),getType(),update(),delete(),query(),insert(),方法,该类所实现的方法能够非常好的实现对Sqlite数据库的增删改查,通知也必须要在AndroidManifast.xml也就是清单文件中注册provider,例如:

<provider
            android:name="com.example.provider.DBProvider"
            android:authorities="com.example.provider.DBProvider"
            android:exported="true" >
        </provider>

其中name标签指的是该组件的位置(通常是包名加类名),而authorities则代表着访问该数据库的Uri,而exported属性标签则代表是否暴露出去。

在ContentProvider的子类中的Oncreate()方法我们需要获取一个Sqlite数据库的连接,同时也需要在子类当中编写一个代码块,其作用是编写为ContentProvider添加匹配Uri

例如:

	private static final UriMatcher matcher=new UriMatcher(UriMatcher.NO_MATCH);
	private static final String AUTHORITY = "com.example.day17demo01provider.db.StuProvider";
	private SQLiteDatabase db;
	//添加匹配项
	static{
//		content://sms--->定位到短信数据所有
		//content://联系人/90---》某一条数据
		//url  协议:http    host:www.baidu.com    path:/img
		//uri  协议:content://   域名:AUTHORITY域名     path:/表名
		
		//添加要哦匹配的URI。---》参数1:authority   参数2:资源路径:表名      参数3:该uri匹配成功的返回码code
		//完整路径Uri:content://com.example.day17demo01provider.db.StuProvider/javaScore
		matcher.addURI(AUTHORITY, DBHelper.TABLE_NAME, 1);
		
		//模糊匹配:id--->#数值
		matcher.addURI(AUTHORITY, DBHelper.TABLE_NAME+"/#", 2);
		
		//模糊匹配:name---》*文本
		matcher.addURI(AUTHORITY, DBHelper.TABLE_NAME+"/*", 3);		
		
//		matcher.match(uri)
	}
	
	//实例化ContentProvider的时候调用---》不要做耗时操作
	@Override
	public boolean onCreate() {
		db=new DBHelper(getContext()).getWritableDatabase();
		return false;
	}
其中“/#”代表通过数字也就是Id匹配,“/*”代表通过字符串匹配,然后是getType()方法,它的作用是通过你所匹配的Uri获取数据的条数来返回字符串

比如当你通过Id来匹配Uri时,你只能获取一条数据那么getType方法就会返回type="vnd.android.cursor.item/vnd."+Uri+"."+表名;

当你通过完整的路劲查询或者是其他属性来查询是,您能获取多条数据那么getType方法会返回type="vnd.android.cursor.dir/vnd."+Uri+"."+表名;

然后是查询方法query,其中参数Uri代表访问的uri,projection代表要查询的列,参数selection代表查询条件,selectionArgs代表查询条件中占位符的值,

sortOrder代表排序

@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
在query方法中,我们首先通过UriMatcher对象调用match方法来匹配Uri,从而判断是通过什么来查询

例如:

//把传进来的uri进行匹配---》定位一条数据还是多条数据
		int code = matcher.match(uri);
		
		Cursor cursor = null;
		
		switch (code) {
		case 1://全部
			cursor = db.query(DBHelper.TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
			break;
		case 2://指定id
			//取出uri中的id
			long id = ContentUris.parseId(uri);
			
			cursor = db.query(DBHelper.TABLE_NAME, projection, DBHelper.JAVA_ID+" = ?", new String[]{id+""}, null, null, sortOrder);
			break;
		case 3://指定name
			//取出name值
			String name=uri.getLastPathSegment();
			//查找条件---》name的值--》模糊匹配
			cursor=db.query(DBHelper.TABLE_NAME, projection, " name like '%"+name+"%'", null, null, null, sortOrder);
			
			break;
		default:
			break;
		}
		return cursor;
同时delete和update方法也是同query方法一样首先判断匹配uri,然后通过code来进行操作,这里就不一一讲述了

下面就是insert方法了

首先先来段代码

	//插入数据
	@Override
	public Uri insert(Uri uri, ContentValues values) {
		int code = matcher.match(uri);
		Uri withAppendedId =null;
		if(code==1){
			long id = db.insert(DBHelper.TABLE_NAME, null, values);
			
			withAppendedId = ContentUris.withAppendedId(uri, id);
		}
		return withAppendedId;
	}
这就是ContentProvider的相关代码了,下面是完整代码:

package com.example.day17demo01provider.db;

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;

public class StuProvider extends ContentProvider{
	private static final UriMatcher matcher=new UriMatcher(UriMatcher.NO_MATCH);
	private static final String AUTHORITY = "com.example.day17demo01provider.db.StuProvider";
	private SQLiteDatabase db;
	//添加匹配项
	static{
//		content://sms--->定位到短信数据所有
		//content://联系人/90---》某一条数据
		//url  协议:http    host:www.baidu.com    path:/img
		//uri  协议:content://   域名:AUTHORITY域名     path:/表名
		
		//添加要哦匹配的URI。---》参数1:authority   参数2:资源路径:表名      参数3:该uri匹配成功的返回码code
		//完整路径Uri:content://com.example.day17demo01provider.db.StuProvider/javaScore
		matcher.addURI(AUTHORITY, DBHelper.TABLE_NAME, 1);
		
		//模糊匹配:id--->#数值
		matcher.addURI(AUTHORITY, DBHelper.TABLE_NAME+"/#", 2);
		
		//模糊匹配:name---》*文本
		matcher.addURI(AUTHORITY, DBHelper.TABLE_NAME+"/*", 3);		
		
//		matcher.match(uri)
	}
	
	//实例化ContentProvider的时候调用---》不要做耗时操作
	@Override
	public boolean onCreate() {
		db=new DBHelper(getContext()).getWritableDatabase();
		return false;
	}
	
	//查找数据--->查找SQLite---》SQLiteDataBase
	//参数1:uri    参数2:要查找的列    参数4:查找条件     参数5:条件中占位符的值   参数6:排序
	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		//把传进来的uri进行匹配---》定位一条数据还是多条数据
		int code = matcher.match(uri);
		
		Cursor cursor = null;
		
		switch (code) {
		case 1://全部
			cursor = db.query(DBHelper.TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
			break;
		case 2://指定id
			//取出uri中的id
			long id = ContentUris.parseId(uri);
			
			cursor = db.query(DBHelper.TABLE_NAME, projection, DBHelper.JAVA_ID+" = ?", new String[]{id+""}, null, null, sortOrder);
			break;
		case 3://指定name
			//取出name值
			String name=uri.getLastPathSegment();
			//查找条件---》name的值--》模糊匹配
			cursor=db.query(DBHelper.TABLE_NAME, projection, " name like '%"+name+"%'", null, null, null, sortOrder);
			
			break;
		default:
			break;
		}
		return cursor;
	}
	//获取类型--->name、没有值匹配---》1、3---》多条数据
	//2:单条数据
	@Override
	public String getType(Uri uri) {
		String type=null;
		
		int code = matcher.match(uri);
		switch (code) {
		case 1://多条数据
		case 3:
			type="vnd.android.cursor.dir/vnd."+AUTHORITY+"."+DBHelper.TABLE_NAME;
			break;		
		case 2:
			type="vnd.android.cursor.item/vnd."+AUTHORITY+"."+DBHelper.TABLE_NAME;
			break;
		default:
			break;
		}
		
		return type;
	}
	//插入数据
	@Override
	public Uri insert(Uri uri, ContentValues values) {
		int code = matcher.match(uri);
		Uri withAppendedId =null;
		if(code==1){
			long id = db.insert(DBHelper.TABLE_NAME, null, values);
			
			withAppendedId = ContentUris.withAppendedId(uri, id);
		}
		return withAppendedId;
	}
	//删除
	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		int rawNum =0;
		
		int code = matcher.match(uri);
		
		if(code==2){//包含有数值--》id
			long id = ContentUris.parseId(uri);//删除条件
			
			//数据库的删除操作
			rawNum = db.delete(DBHelper.TABLE_NAME, DBHelper.JAVA_ID+" = ?", new String[]{id+""});
		}
		
		return rawNum;
	}
	//更新
	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
		
		int code = matcher.match(uri);
		switch (code) {
		case 1://没有指定name、id
			db.update(DBHelper.TABLE_NAME, values, selection, selectionArgs);
			break;
		case 2://id
			//取出id
			long id = ContentUris.parseId(uri);
			
			//根据id去更新数
			db.update(DBHelper.TABLE_NAME, values, DBHelper.JAVA_ID+" = ?", new String[]{id+""});
			break;
		case 3://name
			//取出name
			String name = uri.getLastPathSegment();
			//根据name去更新
			db.update(DBHelper.TABLE_NAME, values, DBHelper.JAVA_NAME+" like '%"+name+"%'", null);
			
			break;
		default:
			break;
		}
		
		return 0;
	}
}

谢谢大家,请大家多多支持



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值