ContentProvider之UriMatcher

上一篇文章中说到CP(ContentProvider简称)不一定使用数据库,但是我们使用CP一般都是用来进程通讯的,数据跨进程传输以后我们一般都会进行保存的,所以一般情况下用到CP都会用到数据库,所以CP在被继承以后会要求使用者复写几个增删改查的方法,当然保存数据也有其他的方式不一定使用数据库。

今天主要说说UriMatcher这个类的使用,我们在创建CP的子类以后在使用的时候一般都会使用到它,一般都会这样写:

public  static final String AUTOHORITY ="com.mm.yy";
    // 设置ContentProvider的唯一标识
    public static final int Permission_Code = 1;

    // UriMatcher类使用:在ContentProvider 中注册URI
    private static final UriMatcher mMatcher;

    static{
      	// 初始化
        mMatcher = new UriMatcher(UriMatcher.NO_MATCH);
      	//添加标记
        mMatcher.addURI(AUTOHORITY,"apppermission_table1", Permission_Code1);
        mMatcher.addURI(AUTOHORITY,"apppermission_table2", Permission_Code2);
       
    }

这段代码是什么意思呢?是不是一定要使用它呢?
从这个类的名称也能看出来,它是用来Uri匹配的,在使用CP进行通讯的时候,访问者通过提供者的清单文件中的authorities标签作为唯一标识来通讯,也就是说,我们通过authorities就可以找到对应的CP了,但是当CP中创建了一个数据库,数据库中又有好几张表的时候,我们怎么直接找到要操作的表呢,就是通过UriMatcher这个类。

上面代码中的最后一行就是给表添加注册码,这句话的意思是当访问我的人,提供给我的uri为content://com.mm.yy/apppermission_table1的时候,表示它要访问apppermission_table1这张表,这张表的标记是Permission_Code1,我们可以通过标记找到这张表,如下代码

(Provider提供者中)

@Override
    public Uri insert(Uri uri, ContentValues values) {

        // 根据URI匹配 URI_CODE,从而匹配ContentProvider中相应的表名
        // 该方法在最下面
        String table = getTableName(uri);

        // 向该表添加数据
        db.insert(table, null, values);
        return uri;
}
...
...
...
//更具uri找到数据库类中的表
private String getTableName(Uri uri){
        String tableName = null;
        switch (mMatcher.match(uri)) {
            case User_Code:
                tableName = DBHelper.TABLE_NAME_ONE;  
                break;
            case Job_Code:
                tableName = DBHelper.TABLE_NAME_TWO;
                break;
        }
        return tableName;
}

到此就明白了UriMatcher的作用了,所以它也不是必要的,当数据库中只有一张表的时候,我们就不用区分要访问哪张表了。

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值