内容提供者ContentProvider
作 用:把应用本身的私有数据提供给其他应用使用。
产生原因:一般应用的私有数据(数据库等)不能被其应用访问,但是如音频、视频、图片和通讯录联系人、短信等数据,要用第三方APP备份或者读取使用时就有冲突,所以就产生了内容提供者ContentProvider,它向其他的应用提供了访问自己私有数据的方式。
一、让A应用中包含内容提供者,给其他应用提供访问方式。
1. 在A应用中,自定义一个类继承ContentProvider,重写其中的“增、删、改、查”方法。
public class TestProvider extends ContentProvider {
private MyOpenHelper myOpenHelper;
private SQLiteDatabase writableDatabase;
/**
* 实现这个方法是为了在启动时初始化ContentProvider,当这个应用的主线程启动时,在这个应用中所有注册了ContentProvider的类
* ,都会调用这个onCreate方法,它不能执行冗长的操作,否则应用程序启动将被延迟。
*/
@Override
public boolean onCreate() {
myOpenHelper = new MyOpenHelper(getContext());//创建一个数据库对象。参数:getContext()
writableDatabase = myOpenHelper.getWritableDatabase();//创建和/或打开一个可以用于阅读和写作的数据库对象
return false;
}
/**
* 其他应用访问该应用时调用本方法
* Uri 代表本应用的主机名,这需要其他应用来指定本应用的主机名
* ContentValues 代表要插入的数据,这需要其他应用来传入数据
*/
@Override
public Uri insert(Uri uri, ContentValues values) {
// 负责向该应用的数据库中插入数据
writableDatabase.insert("tableName", null, values);// tableName数据库表名
return null;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// 负责从本应用的数据库中删除数据
return 0;
}
@Override
public String getType(Uri uri) {
// 获得数据类型
return null;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// 负责从该应用的数据库中查询数据
return null;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
// 负责更新本应用的数据库时调用
return 0;
}
}
2.在配置清单文件时,需要指定主机名authorities。
2.1 安卓四大组件都需要在清单文件中配置,内容提供者需要在清单文件中注册。因为这四类组件都不是我们去创建的,我们只是extends他们,最终都是交给系统去执行的,ContentProvider是4大组件中唯一的不需要意图(intent)的组件,Activity的启动要意图,services的启动需要意图,广播的发送需要意图。
2.2 需要配置主机名,即访问地址。因为每个应用的私有数据库都有一个与之对应的内容提供者,来给其他应用提供访问这个APP的私有数据库的方式,也就是说在手机中有很多个内容提供者,必须通过主机名来区分,让其他应用能准确找到并访问这个数据库。
2.3 位置在<application>
标签里,和<activity>
处于同级。
<provider
android:name="com.watom.www.TestProvider "
android:authorities="com.watom.person"<!--作为一个标记或者地址,让其他APP可以准确访问这个ContentProvider-->
android:exported="true" <!--可以从数据库中查询到数据-->
>
</provider>
二、让B应用通过内容提供者,来操作A应用里面的私有数据(数据库)。
在B应用中的某位置,用ContentResolver提供的方法来操作A应用的数据,A和B的这些方法相互对应,如下:
//为本应用获取ContentResolver实例对象
ContentResolver resolver = getContentResolver();
//设置需要插入的数据
ContentValues values = new ContentValues();
values.put("name", "王五");//根据数据库表插入数据
values.put("age", "19");
//这个insert方法会去访问内容提供者的insert方法
resolver.insert(Uri.parse("content://com.watom.person/person"), values);
//插入另一条数据
values.clear(); //清除values的内容
values.put("name", "张三");
values.put("age", "20");
resolver.insert(Uri.parse("content://com.watom.person/person"), values);