上一篇文章中说到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
的作用了,所以它也不是必要的,当数据库中只有一张表的时候,我们就不用区分要访问哪张表了。