ContetProvider之数据库

以前学习的时候,是通过使用CP(ContentProvider的简称)来访问系统的短信数据库来学习的,工作上很少用到CP,一直以为只有当访问数据库的时候才会用到CP,再加上集成CP以后实现的几个方法都是增删改查方法就很自然的以为它和数据库有关系,这次动手发现使用CPr不一定要使用数据库,两个应用只是通过manifest文件中Provider标准下的authorities标签来进行识别通讯的,底层使用的Binder机制。

所以只要对应好authorities,其他的都不需要,只要在一个应用中通过Uri找到对应的authorities,然后在另一个应用中接收即可。

进程1(Provider提供者)

public class MyProvider extends ContentProvider {

    // 以下是ContentProvider的6个方法
    
     //初始化ContentProvider
    @Override
    public boolean onCreate() {

        mContext = getContext();
        return true;
    }

    /**
     * 添加数据
     */

    @Override
    public Uri insert(Uri uri, ContentValues values) {
		 try {
		            String pkg = (String) values.get("pkg");
		            String per = (String) values.get("permission");
		            Log.e("zh","进程1--pkg:" + pkg + "--permission:" + per);
		        }catch (Exception e){
		            e.printStackTrace();
		        }
		        // 当该URI的ContentProvider数据发生变化时,通知外界(即访问该ContentProvider数据的访问者)
		        mContext.getContentResolver().notifyChange(uri, null);
		        return uri;
      }

    /**
     * 查询数据
     */
    @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;
    }

    /**
     * 删除数据
     */
    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        return 0;
    }

    @Override
    public String getType(Uri uri) {
        return null;
    }
}

然后在清单文件中:

<provider
            android:exported="true"        //可以让外部访问
            android:name=".sdk.MyProvider" //Provider的路径
            android:authorities="com.mm.yy"  //自定义的字段,用来和别的进程相互识别
 />

进程2(Provider访问者)

//按钮点击调用
public void show(View view){
        Uri uri_user = Uri.parse("content://com.mm.yy"); //通过自定义的字段找到对应的CP
        // 插入表中数据
        ContentValues values = new ContentValues();

        values.put("pkg", "4");
        values.put("permission", "Jordan");
        // 获取ContentResolver
        ContentResolver resolver =  getContentResolver();
        // 通过ContentResolver 根据URI 向ContentProvider中插入数据
        resolver.insert(uri_user,values);
         Log.e("zh","进程2,插入-->pkg:4--permission:Jordan");

    }

进程二就完毕了,到这里就能实现最简单的CP通讯,运行两个程序以后,点击按钮,打印如下
在这里插入图片描述

所以CP的使用和数据库根本没有什么关系,只不过我们继承ContentProvider类以后要实现六个方法,看起来和数据库有关,如果我们不进行数据的保存是可以不适用数据库的。

参考链接:https://juejin.im/entry/597811f6f265da6c2e0fc6fd

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值