内容提供者(ContentProvider)复习

来源:互联网 发布:淘宝hd注销后无法登陆 编辑:程序博客网 时间:2024/06/05 16:35

ContentProvider是不同应用程序之间进行数据交换的API,ContentProvider以某种Uri的形式对外提供数据,允许其它应用访问或修改数据,其它的应用程序使用ContentResolver根据Uri去访问指定的ContentProvider提供的数据。

下面看一下内容提供者的使用步骤:

  1. 定义一个内容提供者: 定义一个类继承ContentProvider,实现未实现的方法。
  2. 在清单文件里配置ContentProvider
  3. 定义一个uri的路径匹配器UriMatcher,在静态代码块中添加匹配规则
  4. 暴露需要暴露的增删改查方法

    官方API文档上的第三步的书写示例

第一步:定义一个内容提供者: 定义一个类继承ContentProvider,实现未实现的方法(这里只对其它应用程序暴露了查询的方法,对应的uri为“content://com.study.myContentProvider/query”)

/** * Created by 春水碧于天 on 2017/1/16. */public class myContentProvider extends ContentProvider {    private static final int QUERYSUCCESS = 0;    private SQLiteOpenHelper dbHelper;    //1.定义一个Uri的路径匹配器    private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);    //2.创建一个静态代码块,在这个里面添加一个uri(类初次加载的时候执行)    static{        /**         * 添加一个Uri进行匹配,返回一个code         * authority:和清单文件里定义的authorities一样           path:自定义路径           code:         *         */        sURIMatcher.addURI("com.study.myContentProvider","query",QUERYSUCCESS);        //可以添加多个Uri    }    /**     * 内容提供者初始化的时候执行     * @return     */    @Override    public boolean onCreate() {        dbHelper = new MySQLiteOpenHelper(getContext()); //初始化一个数据库的操作对象        return true;    }    @Override    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {        if(QUERYSUCCESS == sURIMatcher.match(uri)){ //进行路径匹配,根据返回码判断是否需要执行的业务逻辑            //路径匹配成功            SQLiteDatabase db = dbHelper.getWritableDatabase();            Cursor cursor = db.query("info", projection, selection, selectionArgs, null, null, sortOrder);            return cursor;        }else{            Log.i("tag","没有匹配上……");            return null;        }    }    @Override    public String getType(Uri uri) { //用于返回当前Uri所代表的数据的MIME类型        return null;    }    @Override    public Uri insert(Uri uri, ContentValues values) { //根据该Uri插入对应的数据        return null;    }    @Override    public int delete(Uri uri, String selection, String[] selectionArgs) {//根据该Uri删除对应的数据        return 0;    }    @Override    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {//根据该Uri更新对应的数据        return 0;    }}
  1. 在清单文件里配置ContentProvider
    在application节点下进行如下配置
<provider    <!--authorities可随意填写-->        android:authorities="com.study.myContentProvider"        android:name="com.example.studycontentprovider.myContentProvider"    <!--true表示允许其它应用访问-->             android:exported="true"        />

这样,一个内容提供者的例子就写好了,一般来说ContentProvider是单例模式的,当多个应用程序通过ContentResolver来操作ContentProvider所提供的数据时,ContentResolver调用的数据操作会委托给同一个ContentProvider进行处理。

注:只要是通过内容提供者暴露出来的数据,其访问的方式都是一样的,就是通过内容解析者进行获取应用程序通过内容提供者暴露出来的数据。

下面实现一个简单的ContentResolver来获取上面的ContentProvider所提供的数据:

ContentResolver获取数据的核心代码:

Uri uri =  Uri.parse("content://com.study.myContentProvider/query");        Cursor cursor = getContentResolver().query(uri,new String[]{"name","money"},null,null,null);        while(cursor.moveToNext()){          String name = cursor.getString(0);          String money =  cursor.getString(1);            Log.i("tag","Name:"+name+"Money:"+money);        }        cursor.close(); //使用完关闭游标

Uri uri = Uri.parse(“content://com.study.myContentProvider/query”);

这里的content://为协议名,固定写法。

执行结果
可以看到成功的通过内容提供者查询到其它应用程序中私有的数据库中的数据。

0 0
原创粉丝点击