内容提供者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);  

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值