Android四大组件之一ContentProvider

来源:互联网 发布:java 接口过滤器 编辑:程序博客网 时间:2024/05/17 02:21

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/bookcase MULTI:return db.query(TABLE, projection, selection, selectionArgs, null, null, sortOrder);//Uri格式为:content://cn.itcast.sqlite.provider.bookprovider/book/1case 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格式数据类型 *  */@Overridepublic String getType(Uri uri) {int code = uriMatcher.match(uri);switch (code) {// 多条数据 content://cn.itcast.providers.bookprovider/bookcase 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格式数据类型 *  */@Overridepublic String getType(Uri uri) {int code = uriMatcher.match(uri);switch (code) {// 多条数据 content://cn.itcast.providers.bookprovider/bookcase 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/2long 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/2long 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")));}






1 0
原创粉丝点击