Android四大组件之一ContentProvider

ContentProvider简介:

        在Android官方指出的Android的数据存储方式总共有五种,分别是:Shared Preferences、网络存储、文件存储、外储存储、SQLite。但是我们知道一般这些存储都只是在单独的一个应用程序之中达到一个数据的共享,有时候我们需要操作其他应用程序的一些数据,例如我们需要操作系统里的媒体库、通讯录等,这时我们就可能通过ContentProvider来满足我们的需求了。


内容提供者特点介绍:
1: Android四大组件之一,没有图形界面
2: 共享数据给第三方应用程序,统一数据访问方式

3: 线性安全,Android系统为每个提供一个实例(单列模式),通过ContentResolver访问ContentProvider

ContentProvider实现流程:


1. 准备需要共享的数据,一般是sqlite数据
2.创建一个类,继承ContentProvider,实现第三方应用访问数据的方法(增删改查)
3.在AndroidManifest.xml 进行注册,并且设置android:autorities属性:认证(在系统中该内容提供者的唯一标识)

4.第三方应用访问ContentProvider, 通过Context.ContentResolver(内容访问者)进行访问,比如:ContentResolver.insert(Uri,ContentValues);


常用API介绍:
1.Uri:(统一资源标识符)表示要操作的数据由两部分组成:内容提供者的标识、具体要访问什么,也就是路径
              content://cn.itcast.sqlite.provider.books/student/

2.UriMatch: 用来匹配Uri的 工具

3.UriMatch.addUri(Uri);//注册

4.Uri UriMatch.match(Uri);匹配Uri

5.ContentUris: Uri内容解析

6.ContentUris.withAppendedId(Uri,id): 在Uri尾部添加id

7.ContentUris.parseIdUuri):解析Uri,获取Uri的id部分


案例:通过ContentProvider共享数据库

把books.db数据库的book表通过ContentProvider实现数据共享,第三方应用可以对book表实现增删改查操作


* 通过UriMatch注册Uri

// 注册Uri,即本ContentProvider只允许哪些Uri访问
	static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
	static {
		/**
		 * 1、AUTHORITY :内容提供者的唯一标识 2、path:路径 3、code:返回码
		 */
		// 匹配的URi是:"content://cn.itcast.sqlite.provider.BookProvider/book"
		matcher.addURI(AUTHORITY, "book", 1);
// 匹配的URi是:"content://cn.itcast.sqlite.provider.BookProvider/book/1"
		matcher.addURI(AUTHORITY, "book/#", 2); // #代表的是数字

	}


* 实现查询操作接口

//查询操作
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		SQLiteDatabase db=dbHelper.getReadableDatabase();
		//匹配码
		int code=uriMatcher.match(uri);
		switch (code) {
//Uri格式为:content://cn.itcast.sqlite.provider.bookprovider/book
		case MULTI:
			return db.query(TABLE, projection, selection, 
					selectionArgs, null, null, sortOrder);
//Uri格式为:content://cn.itcast.sqlite.provider.bookprovider/book/1
		case SINGLE:
			long id=ContentUris.parseId(uri);//解析Uri,获取Id部分
			if(selection!=null){	
				selection=selection+" and _id="+id;
			}else{
				selection=" _id="+id;
			}
			return db.query(TABLE, projection, selection, 
					selectionArgs, null, null, sortOrder);
		default:
			 throw new IllegalArgumentException("Uri不合法");	
		}
	}

	/**返回数据的类型:MIME格式数据类型
	 * 
	 */
	@Override
	public String getType(Uri uri) {
		int code = uriMatcher.match(uri);
		switch (code) {
// 多条数据 content://cn.itcast.providers.bookprovider/book

		case MULTI:			
return "vnd.android.cursor.dir/book";
// 单条数据 content://cn.itcast.providers.bookprovider/book/#		
case SINGLE:			
return "vnd.android.cursor.item/book";
		default:
			throw new IllegalArgumentException("非法uri");
		}
	}

* 通过获得访问数据类型接口

	/**返回数据的类型:MIME格式数据类型
	 * 
	 */
	@Override
	public String getType(Uri uri) {
		int code = uriMatcher.match(uri);
		switch (code) {
// 多条数据 content://cn.itcast.providers.bookprovider/book

		case MULTI:			
return "vnd.android.cursor.dir/book";
// 单条数据 content://cn.itcast.providers.bookprovider/book/#		
case SINGLE:			
return "vnd.android.cursor.item/book";
		default:
			throw new IllegalArgumentException("非法uri");
		}
	}



* 实现插入操作接口




	public Uri insert(Uri uri, ContentValues values) {
		SQLiteDatabase db=dbHelper.getWritableDatabase();
		int code=uriMatcher.match(uri);
		switch (code) {
		case MULTI:
			long id=db.insert(TABLE, null, values);
			return ContentUris.withAppendedId(uri, id);
		default:
			throw new IllegalArgumentException("Uri非法");
		}
	}


* 实现删除操作接口


public int delete(Uri uri, String selection, String[] selectionArgs) {
		SQLiteDatabase db=dbHelper.getReadableDatabase();//得到数据库访问类对象
		int num=0;//删除记录数
		int code=uriMatcher.match(uri);//匹配码
		switch (code) {
		case MULTI://多行操作
			num= db.delete(TABLE, selection, selectionArgs);
			db.close();
			break;
		case SINGLE://单行操作
			//content://cn.itcast.sqlite.provider.bookprovider/book/2
			long id=ContentUris.parseId(uri);
			if(selection!=null){	
				selection=selection+" and _id="+id;
			}else{
				selection=" _id="+id;
			}
			num= db.delete(TABLE, selection, selectionArgs);
			db.close();//关闭数据库
			break;
		default:
			db.close();
			 throw new IllegalArgumentException("Uri不合法");	
		}
		return num;
	}

* 实现更新操作接口


	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
		SQLiteDatabase db=dbHelper.getReadableDatabase();
		int num=0;//影响的行数
		//匹配码
		int code=uriMatcher.match(uri);
		switch (code) {
		case MULTI:
			num= db.update(TABLE, values, null, null);
			db.close();
			break;
		
		case SINGLE:
			//content://cn.itcast.sqlite.provider.bookprovider/book/2
			long id=ContentUris.parseId(uri);
			if(selection!=null){	
				selection=selection+" and _id="+id;
			}else{
				selection=" _id="+id;
			}
			num= db.update(TABLE, values, selection, null);
			db.close();
			break;
		default:
			db.close();
			 throw new IllegalArgumentException("Uri不合法");	
		}
		return num;
	}


* 第三方访问ContentProvider



//准备Uri:描述要访问的数据
Uri uri=Uri.	 parse("content://cn.itcast.sqlite.provider.bookprovider/book");
		//得到内容访问者
ContentResolver contentResolver=getContext().getContentResolver();
		//通过内容访问者查询ContentProvider的Uri数据
		Cursor cursor=contentResolver.query(uri, null, null, null, null);
		//遍历游标,得到访问结果
		while(cursor.moveToNext()){
	System.out.println(cursor.getString(cursor.getColumnIndex("name")));
		}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值