1.关于ContentProvider和ContentResolver

(1)ContentProvider(内容提供者)
ContentProvider是不同应用程序之间进行数据交换的标准API,只提供数据的访问接口。
ContentProvider以某种Uri形式对外提供数据,允许其他应用访问或修改数据,其他应用程序通过ContentResolver根据Uri去访问操作指定数据。

将一个字符串转换成Uri:

Uri uri = Uri.parse("content://com.gc.contentprovider/test/100");

ContentProvider只有一个onCreate()生命周期方法且只会被调用一次,当其他应用通过ContentResolver第一次访问该ContentProvider时,onCreate()方法将会被回调。

(2)ContentResolver(内容观察者)

Content提供了如下方法来获取ContentResolver:

getContentResolver();

2.ContentProvider、ContentResolver、Uri三者之间的关系

3.开发ContentProvider

开发ContentProvider需要两步:
第1步:继承ContentProvider,实现query()、insert()、update()、delete()等方法(这些方法是给其他应用调用的);
第2步:在AndroidManifest.xml注册该ContentProvider,指定android:authorities属性(指定ContentProvider对应的Uri)和android:exported属性(设置android:exported:true表示允许其他应用程序调用)。

接下来实际开发一个ContentProvider:

(1)创建MyProvider,继承ContentProvider

public class MyProvider extends ContentProvider {    // 第一次创建调用    @Override    public boolean onCreate() {        System.out.println("onCreate");        return true;    }    // 返回值表示该ContentProvider所提供数据的MIME类型    @Override    public String getType(Uri uri) {        System.out.println("getType");        return null;    }    // 查询方法,返回查询得到的Cursor    @Override    public Cursor query(Uri uri, String[] projection, String where, String[] whereArgs, String sortOrder) {        System.out.println(uri + "-query");        System.out.println("where参数:" + where);        return null;    }    // 插入方法,返回新插入记录的Uri    @Override    public Uri insert(Uri uri, ContentValues values) {        System.out.println(uri + "-insert");        System.out.println("values参数:" + values);        return null;    }    // 删除方法,返回被删除的记录条数    @Override    public int delete(Uri uri, String where, String[] whereArgs) {        System.out.println(uri + "-delete");        System.out.println("where参数:" + where);        return 0;    }    // 删除方法,返回被更新的记录条数    @Override    public int update(Uri uri, ContentValues values, String where, String[] whereArgs) {        System.out.println(uri + "-update");        System.out.println("where参数:" + where + ",values参数:" + values);        return 0;    }}

(2)配置ContentProvider
在AndroidManifest.xml中application元素下添加如下子元素即可

<!-- 注册一个ContentProvider --><!-- exported:指定是否允许其他应用调用,true允许 --><!-- name:指定ContentProvider实现类的类名 --><!-- authorities:指定ContentProvider对应的Uri --><provider  android:exported="true" android:name=".MyProvider" android:authorities="com.gc.contentprovider.myprovider"></provider>

(3)使用ContentResolver调用方法(其他应用程序内)

public class MyResolver extends Activity {    ContentResolver resolver;    Uri uri = Uri.parse("content://com.gc.contentprovider.myprovider/");    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        // 获取系统的ContentResolver对象        resolver = getContentResolver();    }    public void query(View source) {        // 调用ContentResolver的query()方法,实际返回的是该Uri对应的ContentProvider的query()的返回值        Cursor c = resolver.query(uri, null, "query_where", null, null);        System.out.println("远程ContentProvider返回的Cursor:" + c);    }    public void insert(View source) {        ContentValues values = new ContentValues();        values.put("name", "android");        // 调用ContentResolver的insert()方法,实际返回的是该Uri对应的ContentProvider的insert()的返回值        Uri newUri = resolver.insert(uri, values);        System.out.println("远程ContentProvider新插入记录的Uri:" + newUri);    }    public void update(View source) {        ContentValues values = new ContentValues();        values.put("name", "android");        // 调用ContentResolver的update()方法,实际返回的是该Uri对应的ContentProvider的update()的返回值        int count = resolver.update(uri, values, "update_where", null);        System.out.println("远程ContentProvider更新记录数:" + count);    }    public void delete(View source) {        // 调用ContentResolver的delete()方法,实际返回的是该Uri对应的ContentProvider的delete()的返回值        int count = resolver.delete(uri, "delete_where", null);        System.out.println("远程ContentProvider删除记录数:" + count);    }}

4.操作系统的ContentProvider

使用ContentResolver操作系统ContentProvider数据的步骤依然是两步:
第1步:调用Activity的getContentResolver()方法获取ContentResolver对象;
第2步:根据需要调用ContentProvider的query()、insert()、update()、delete()方法操作数据即可。

注意:需要提前了解该ContentProvider的Uri以及该ContentProvider所操作的数据列的列名,这些可通过查阅官方文档来获取。

更多相关文章

  1. android的popupwindow点击返回按钮关闭
  2. Android(安卓)重学系列 Ashmem匿名共享内存
  3. android 触摸事件传递机制
  4. 关于SQLite数据库的那些事儿
  5. Android(安卓)3.0 honeycomb TextView onDraw()方法无效
  6. WindowManger与window之基础篇
  7. Android(安卓)IPC机制—Binder的工作机制
  8. Android(安卓)View.onMeasure方法的理解
  9. 【android】利用getViewTreeObserver().addOnGlobalLayoutListen

随机推荐

  1. Android开发者指南(15) ―― Managing Vi
  2. Android(安卓)APP安装后不在桌面显示图标
  3. android 百度地图点击出现圆圈
  4. Android(安卓)- GET请求,POST请求,数据提交
  5. EditText限制输入长度
  6. iPhone开发网站、论坛、博客
  7. android uri用法
  8. ImageButton 边框问题
  9. Android(安卓)ScrollView反弹效果的实现
  10. android 中 startActivityForResult 的使