ContentProvider是Android中跨进程数据交换的重要类,Android为数据交换提供了一个标准ContentProvider.

那么应该如何完整实现开发一个contentProvider呢
1、首先需要定义自己的ContentProvider,该类需要继承Android提供的ContentProvider的基类
2、需要在AndroidManifest.xml文件中注册这个ContentProvider

1、子类

import android.content.ContentProvider;import android.content.ContentValues;import android.database.Cursor;import android.net.Uri;import android.support.annotation.NonNull;import android.support.annotation.Nullable;import android.util.Log;public class DictProvider extends ContentProvider {    String TAG  = "=======TAG=====" ;    @Override    public boolean onCreate() {        Log.v(TAG,"onCreate");        return false;    }    @Nullable    @Override    public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {        Log.v(TAG,"query");        return null;    }    @Nullable    @Override    public String getType(@NonNull Uri uri) {        Log.v(TAG,"getType");        return null;    }    @Nullable    @Override    public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {        Log.v(TAG,"insert");        return null;    }    @Override    public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {        Log.v(TAG,"delete");        return 0;    }    @Override    public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {        Log.v(TAG,"update");        return 0;    }}

2、注册

// true 允许外部应用启动 反之 不能启动

3、如何配置一个Uri,Uri扮演什么样的角色。

Content://com.jewelermobile.gangfu.zdydemo1.DictProvider/资源部分

(1)Content:// 这部分是Android的ContentProvider规定,并且固定
(2)com.jewelermobile.gangfu.zdydemo1.DictProvider 这部分是注册时的android:authorities,注册之后并且固定
(3)资源部分,这个根据查询资源改变所以不固定

Uri其实就是一个地址,只有通过Uri才能对应去操作ContentProvider,就像一条唯一通往胜利道路。

4、怎么从外部应用调用操作此ContentProvider?

Android提供了ContentResolver去操作ContentProvider
final ContentResolver p = this.getContentResolver();

    Uri uri = Uri.parse("content://com.jewelermobile.gangfu.zdydemo1.DictProvider/");    private void initContentProvider() {        final ContentResolver p = this.getContentResolver();        findViewById(R.id.add).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                p.insert(uri,new ContentValues());            }        });        findViewById(R.id.del).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                p.delete(uri,"",new String[]{});            }        });        findViewById(R.id.update).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                p.update(uri,null,null,new String[]{});            }        });        findViewById(R.id.qur).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                p.query(uri,null,null,null,null);            }        });    }

运行结果测试


通过测试可以知道每次创建时回调Oncreate方法

public String getType(@NonNull Uri uri)方法的作用,代表当前返回数据MIME类型,如果包含多条记录,那么MIME类型字符串以vnd.android.cursor.dir/开头,如果只有一条记录那么MIME类型字符串以vnd.android.cursor.item/开头。

5、android提供UriMatcher 和 ContentUris工具类操作Uri

(1)、UriMatcher
1、void addUri(String authority,String path,int code) 该方法参数authority和path组成一个Uri,code为当前Uri的标识码
2、int match(Uri uri) 通过注册的Uri获取标识码

 UriMatcher uriMatcher=new UriMatcher(UriMatcher.NO_MATCH); //注册Uri uriMatcher.addURI("com.jewelermobile.gangfu.zdydemo1.DictProvider","path",1);  //获取注册的Uri标识码   结果为1   uriMatcher.match(Uri.parse("content://com.jewelermobile.gangfu.zdydemo1.DictProvider/path"));

(2)、ContentUris
1、WithAppendedId(Uri uri,int id) 用于为路径加Id

 ContentUris.withAppendedId(Uri.parse("content://com.jewelermobile.gangfu.zdydemo1.DictProvider/path"),1); //添加id之后 content://com.jewelermobile.gangfu.zdydemo1.DictProvider/path/1

2、parseId(Uri uri) 用于指定的Uri中解析出Id

ContentUris.parseId(Uri.parse("content://com.jewelermobile.gangfu.zdydemo1.DictProvider/path/1"));//解析出来的Id为 1 

更多相关文章

  1. AndroidMenifest.xml中android:sharedUserId="android.uid.syste
  2. Android(安卓)Wi-Fi基本操作
  3. Android对图片局部扩大的实现
  4. Android简易计算器(破烂Alpha版,后续更新)
  5. Google提供Fastboot和ADB单独下载服务
  6. android的文件操作
  7. 2011.08.18——— android 图片效果 ImageSwitcher+GestureDetec
  8. Android(安卓)文件及文件夹操作
  9. android中 sqlite sql操作

随机推荐

  1. php判断数组某个值是否存在
  2. php生成一个不重复的会员号
  3. tideways+toolkit对php代码进行性能分析
  4. php+nodeJs+thrift协议,实现zookeeper节点
  5. PHP写时复制(Copy On Write)
  6. PHP中的闭包
  7. PHP 中使用 TUS 协议来实现大文件的断点
  8. 大括号在php中的一些作用
  9. PHP 反射之动态代理
  10. thinkphp常用系统配置大全