Android 四大组件之一,为存储和获取数据提供统一的接口,可以在不同的应用程序之间共享数据。就是将自身应用程序的数据提供给外部应用程序的一种手段。比如微信访问手机联系人。
ContentProvider 访问自身数据 (如联系人) 暴露一个接口提供给外部应用。会将数据都认定为一种表,用操作数据库表的方式操作数据。
* 四大组件的特性 : 都需要继承,都要在清单文件中注册。
新建ContentProvider, 右键 New - > other -> ContentProvider
image.png
而在uri authorties 中填写,最终形成的是对 provider的配置,通过Android:authoities属性授权,指定当前ContentProvider的uri标识,必须唯一。通常使用域名反写(包名)。 其他程序就是通过这个android:authorties 来识别的。
image.png
ContentResolver 是用来访问其他数据的手段
在其A进程的 Activity中获取 :
ContentResolver resolver = getContentResolver();
resolver有一些列增删改查的方法,对应B进程的MyContentProvider中的方法。
image.png
而第一个参数就是对应B进程的authorties的 uri. 就可以调用到同名的ContentProvider中的方法。
insert() :
在进程B 自定义MyContentProvider 中
@Override
public Uri insert(Uri uri, ContentValues values) {
long id = db.insert("my.db", null, values);
// 这个方法 是 把 id 追加到 Uri 后面 ;
return ContentUris.withAppendedId(uri, id);
}
在进程A中
ContentValues values = new ContentValues();
// 字段对应 MyContentProvider的onCreate()中创建 数据库的 字段。
values.put("name", "张三");
values.put("age", 13);
values.put("gender", "male");
Uri uri = resolver.insert(Uri.parse("content://com.exmple.contentprovider"), values);
// 就会把 insert()中追加在Uri 后面的id 解析出来,给出一个反馈。
long id = ContentUris.parseId(uri);
Toast.makeText(this, "新添加的 id =" +id, Toast.LENGTH_SHORT).show();
这样的就可以使用ContentResolver调用B进程中ContentProvider中的insert方法
query() , delete(), update() 我真的是太懒了...
网友评论