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(部分代码):

ContentProvider and ContentResolver的应用

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;
效果图:

ContentProvider and ContentResolver的应用