ContentProvider and ContentResolver的应用
一、什么是ContentProvider、ContentResolver?
ContentProvider是Android四大组件之一,是一种数据包装器,提供统一的借口对数据进行操作,调用者不用关心数据到底如何存储。一个应用实现ContentProvider来提供内容给别的应用来操作, 一个应用通过ContentResolver来操作别的应用数据,当然在自己的应用中也可以。
二、创建自定义ContentProvider的步骤
1.使用SQLite技术,创建好数据库和数据表;
2.新建类继承ContentProvider;
3.创建UriMatcher,定义Uri规则;
4.重写6个抽象方法(oncreate、insert、delete、grtType、update、query);
5在AndroidManifest中注册provider;
6.ContentResolver对ContentProvoder共享的数据进行增删改查。
三、ContentProvider类主要方法的作用:
public boolean onCreate()
该方法在ContentProvider创建后就会被调用, Android开机后, ContentProvider在其它应用第一次访问它时才会被创建。
public Uri insert(Uri uri, ContentValues values)
该方法用于供外部应用往ContentProvider添加数据。
public int delete(Uri uri, String selection, String[] selectionArgs)
该方法用于供外部应用从ContentProvider删除数据。
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
该方法用于供外部应用更新ContentProvider中的数据。
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
该方法用于供外部应用从ContentProvider中获取数据。
四、Uri介绍:
Uri代表了要操作的数据,Uri主要包含了两部分信息:1》需要操作的ContentProvider ,2》对ContentProvider中的什么数据进行操作,一个Uri由以下几部分组成:
ContentProvider(内容提供者)的scheme已经由Android所规定, scheme为:content://
主机名(或叫Authority)用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。
路径(path)可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:
要操作person表中id为10的记录,可以构建这样的路径:/person/10
要操作person表中id为10的记录的name字段, person/10/name
要操作person表中的所有记录,可以构建这样的路径:/person
要操作xxx表中的记录,可以构建这样的路径:/xxx
当然要操作的数据不一定来自数据库,也可以是文件、xml或网络等其他存储方式,如下:
要操作xml文件中person节点下的name节点,可以构建这样的路径:/person/name
如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下:
Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person")
五、UriMatcher使用类介绍:
因为Uri代表了要操作的数据,所以我们经常需要解析Uri,并从Uri中获取数据。Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher 和ContentUris 。
UriMatcher类用于匹配Uri,它的用法如下:
首先第一步把你需要匹配Uri路径全部给注册上,如下:
//常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码
UriMatcher sMatcher = new UriMatcher(UriMatcher.NO_MATCH);
//如果match()方法匹配content://cn.itcast.provider.personprovider/person路径,返回匹配码为1
sMatcher.addURI(“cn.itcast.provider.personprovider”, “person”, 1);//添加需要匹配uri,如果匹配就会返回匹配码
//如果match()方法匹配content://cn.itcast.provider.personprovider/person/230路径,返回匹配码为2
sMatcher.addURI(“cn.itcast.provider.personprovider”, “person/#”, 2);//#号为通配符
switch (sMatcher.match(Uri.parse("content://cn.itcast.provider.personprovider/person/10"))) {
case 1
break;
case 2
break;
default://不匹配
break;
}
六、示列代码:(student和teacher通信)
注册:
<provider
android:enabled="true" android:exported="true" android:authorities="com.lenovo.student.provider" android:name=".StudentProvider"/>
新建类继承ContentProvider:
public class StudentProvider extends ContentProvider { private String TAG="StudentProvider"; private DBHelder dbHelder; private static final int STUDENT=0; private static final int STUDENT_ITEM=1; private static final int TEACHER=2; private static final int TEACHER_ITEM=3; private static final String AUTHORTTY="com.lenovo.student.provider"; private static UriMatcher uriMatcher; static { uriMatcher=new UriMatcher(UriMatcher.NO_MATCH); uriMatcher.addURI(AUTHORTTY,"student",STUDENT); uriMatcher.addURI(AUTHORTTY,"student",STUDENT_ITEM); uriMatcher.addURI(AUTHORTTY,"teacher",TEACHER); uriMatcher.addURI(AUTHORTTY,"teacher",TEACHER_ITEM); } @Override public boolean onCreate() { dbHelder=new DBHelder(getContext(),"student_db",null,1); Log.e(TAG ,"onCreate.........."); return false; } @Nullable @Override public Cursor query(@NonNull Uri uri, @Nullable String[] strings, @Nullable String s, @Nullable String[] strings1, @Nullable String s1) { Log.e(TAG ,"query.........."); return null; } @Nullable @Override public String getType(@NonNull Uri uri) { Log.e(TAG ,"getType.........."); return null; } @Nullable @Override public Uri insert(@NonNull Uri uri, @Nullable ContentValues contentValues) { int m=uriMatcher.match(uri); switch (m){ case STUDENT: Log.e(TAG ,"insert.........."); SQLiteDatabase database=dbHelder.getReadableDatabase(); database.insert("student",null,contentValues); break; case STUDENT_ITEM: Log.e(TAG ,"insert.........."); SQLiteDatabase database1=dbHelder.getReadableDatabase(); database1.insert("student",null,contentValues); break; case TEACHER: Log.e(TAG ,"insert.........."); SQLiteDatabase database2=dbHelder.getReadableDatabase(); database2.insert("student",null,contentValues); break; case TEACHER_ITEM: Log.e(TAG ,"insert.........."); SQLiteDatabase database3=dbHelder.getReadableDatabase(); database3.insert("student",null,contentValues); break; } return null;
}
Teacher.Activity(部分代码):
public void onClick(View view) { switch (view.getId()){ case R.id.text_btn: String name=nameet.getText().toString(); Uri uri=Uri.parse("content://com.lenovo.student.provider"); ContentResolver resolver=getContentResolver(); ContentValues contentValues=new ContentValues(); contentValues.put("name",name); resolver.insert(uri,contentValues); break;效果图: