版权声明:随便转都是学别人的 https://blog.csdn.net/weixin_35691921/article/details/84998639
UriMatcher
FUNCTION :
本质上是一个文本过滤器,用在contentProvider中帮助我们过滤,通过匹配Uri,分辨出查询者想要查询哪个数据表.
USAGE METHOD:
第一步,初始化:
private static final UriMatcher URI_MATCHER;
URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
第二步,注册需要的Uri :
static {
URI_MATCHER.addURI(AUTHORITY, TABLE_A, TABLE_A_MSG);
URI_MATCHER.addURI(AUTHORITY, TABLE_B, TABLE_B_MSG);
}
第三步,与已经注册的Uri进行匹配 (查询):
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
String table = null;
switch (URI_MATCHER.match(uri)) {
case NAVI:
break;
case MSG:
table = TABLE_A;
break;
case VR:
table = TABLE_B;
break;
default:
break;
}
Cursor cursor= mDB.query(table, projection, selection, selectionArgs, null, null, sortOrder);
return cursor;
}
METHODS
Public void **addURI**(String authority,String path,int code)
添加一个用于匹配的URI,当匹配成功时则code。URI可以是精确的字符串,uri中带有*表示可匹配任意text,#表示只能匹配数字。
Authority:用于匹配的域名;
Path:匹配路径,*表示text的占位符,#表示使用数字的占位符;
Code:当使用匹配成功后返回code,值需要大于0,否则抛出IllegalArgument异常。
此方法将authority按照”/”进行拆分,然后将拆分后的每一部分保存到UriMatcher类型的ArrayList中;
在添加的时候会判断当前authority是否已经添加过,若已加则break;
若未添加过,
则判断是否含有”#”则将其标识成1,代表域名后面跟随的是数字;
”*”标识成2,代表域名后面跟随的是文本;
0代表后面没有跟随数据;
最后创建一个新的UriMatcher对象添加到集合中。
Public int match(Uri uri)
尝试在url中匹配相对应的路径
Uri:指定需要匹配的url;
返回值:在使用addURI时产生的code,若没有匹配则返回-1。
使用uri. getPathSegments()获取uri中各段存入list中,若list size为0或uri的Authority为null则返回默认值(此默认值在new时指定,若为指定则为-1);
然后遍历ArrayLis进行匹配uri。