UriMatcher类
在ContentProvider中,该类主要用来帮助匹配相对应的URI。
1. 构造函数:创建URI树的根节点
a) Public UriMatcher():默认根节点编码为-1;
b) Public UriMatcher(int code):code参数表示指定根节点的编码。
2. 方法
a) 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对象添加到集合中。
b) Public int match(Uri uri)
尝试在url中匹配相对应的路径
Uri:指定需要匹配的url;
返回值:在使用addURI时产生的code,若没有匹配则返回-1。
使用uri. getPathSegments()获取uri中各段存入list中,若list size为0或uri的Authority为null则返回默认值(此默认值在new时指定,若为指定则为-1);
然后遍历ArrayLis<UriMatcher>进行匹配uri。
参考源码:
/* Copyright (C) 2006 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
import android.net.Uri;
public class UriMatcher
{
public static final int NO_MATCH = -1;
/***
*
* Creates the root node of the URI tree.
*
*
*
* @param code
* the code to match for the root URI
*/
public UriMatcher(int code){
mCode = code;
mWhich = -1;
mChildren = new ArrayList<UriMatcher>();
mText = null;
}
private UriMatcher(){
mCode = NO_MATCH;
mWhich = -1;
mChildren = new ArrayList<UriMatcher>();
mText = null;
}
/***
*
* Add a URI to match, and the code to return when this URI is
*
* matched. URI nodes may be exact match string, the token "*"
*
* that matches any text, or the token "#" that matches only
*
* numbers.
*
*
*
* @param authority
* the authority to match
*
* @param path
* the path to match. * may be used as a wild card for
*
* any text, and # may be used as a wild card for numbers.
*
* @param code
* the code that is returned when a URI is matched
*
* against the given components. Must be positive.
*/
public void addURI(String authority, String path, int code){
if (code < 0) {
throw new IllegalArgumentException("code " + code
+ " is invalid: it must be positive");
}
String[] tokens = path != null ? PATH_SPLIT_PATTERN.split(path) : null;
int numTokens = tokens != null ? tokens.length : 0;
UriMatcher node = this;
for (int i = -1; i < numTokens; i++) {
String token = i < 0 ? authority : tokens[i];
ArrayList<UriMatcher> children = node.mChildren;
int numChildren = children.size();
UriMatcher child;
int j;
for (j = 0; j < numChildren; j++) {
child = children.get(j);
if (token.equals(child.mText)) {
node = child;
break;
}
}
if (j == numChildren) {
// Child not found, create it
child = new UriMatcher();
if (token.equals("#")) {
//mWhich=1
child.mWhich = NUMBER;
} else if (token.equals("*")) {
//mWhich=2
child.mWhich = TEXT;
} else {
//mWhich=0
child.mWhich = EXACT;
}
child.mText = token;
node.mChildren.add(child);
//node = child;
node = child;
}
}
//node.mCode = code;
node.mCode = code;
}
static final Pattern PATH_SPLIT_PATTERN = Pattern.compile("/");
/***
*
* Try to match against the path in a url.
*
*
*
* @param uri
* The url whose path we will match against.
*
*
*
* @return The code for the matched node (added using addURI),
*
* or -1 if there is no matched node.
*/
public int match(Uri uri){
final List<String> pathSegments = uri.getPathSegments();
final int li = pathSegments.size();
UriMatcher node = this;
if (li == 0 && uri.getAuthority() == null) {
return this.mCode;
}
for (int i = -1; i < li; i++) {
String u = i < 0 ? uri.getAuthority() : pathSegments.get(i);
ArrayList<UriMatcher> list = node.mChildren;
if (list == null) {
break;
}
node = null;
int lj = list.size();
for (int j = 0; j < lj; j++) {
UriMatcher n = list.get(j);
which_switch:
switch (n.mWhich) {
case EXACT:
if (n.mText.equals(u)) {
node = n;
}
break;
case NUMBER:
int lk = u.length();
for (int k = 0; k < lk; k++) {
char c = u.charAt(k);
if (c < '0' || c > '9') {
break which_switch;
}
}
node = n;
break;
case TEXT:
node = n;
break;
}
if (node != null) {
break;
}
}
if (node == null) {
return NO_MATCH;
}
}
return node.mCode;
}
private static final int EXACT = 0;
private static final int NUMBER = 1;
private static final int TEXT = 2;
private int mCode;
private int mWhich;
private String mText;
private final ArrayList<UriMatcher> mChildren;
}
分享到:
相关推荐
通过本指南的学习,我们可以了解到 `URL` 类在Java中提供了强大的功能来定位和获取网络资源。通过理解URL的基本组成以及如何创建和使用URL对象,开发者可以更高效地利用Java来访问网络上的各种资源。此外,了解如何...
2. **UriMatcher类**:用于匹配URI,确定应该调用哪个方法来处理请求。通过添加代码,我们可以为不同的操作(例如读取、写入)设置不同的URI模式。 3. **数据库操作类**:通常是一个SQLiteOpenHelper子类,用于管理...
ContentProvider是一个抽象类,它为其他应用程序提供访问应用程序私有数据的方式。Android系统中,包括通讯录、媒体文件等系统数据都是通过ContentProvider进行访问的。开发者可以通过自定义ContentProvider来暴露...
在实现ContentProvider时,你需要在AndroidManifest.xml清单文件中声明它,并定义匹配URI的类,例如UriMatcher。UriMatcher的addUri()方法用于添加URI模式,而withAppendedId()可以帮助构建包含ID的URI。当需要访问...
你需要定义一个UriMatcher类,用于匹配不同的Uri请求。 2. 创建ContentProvider类:继承自ContentProvider抽象类,重写其中的关键方法,如query(), insert(), update(), delete()以及getType()。这些方法分别对应对...
- 在Xamarin中,创建ContentProvider需要继承自Android.Content.Provider.ContentProvider类,并重写其关键方法,如OnCreate、Insert、Query、Update、Delete等。 - 需要在AndroidManifest.xml中声明...
首先,ContentProvider的基本结构包括四个关键组件:`ContentContract`(内容契约类)、`ContentProvider`(内容提供者类)、`ContentResolver`(内容解析器)和`UriMatcher`(URI匹配器)。`ContentContract`定义了...
由于 URI 可能包含多种不同的路径,为了更方便地处理不同的 URI 路径,Android 提供了 `UriMatcher` 类来帮助匹配 URI。 1. **创建 UriMatcher 对象** ```java UriMatcher matcher = new UriMatcher(UriMatcher....
你需要查看源代码中的`ContactProvider`类,了解如何实现`UriMatcher`、`CursorLoader`和`ContentResolver`的交互。 3. **联系人UI**: 通讯录界面一般包含一个列表视图,显示联系人的名字和电话号码。源代码可能...
开发者可以使用UriMatcher类来解析和处理不同的数据请求。 3. **Service(服务)** Service是在后台运行的无用户界面组件,用于执行长时间运行的任务,即使用户切换到其他应用,Service也会继续运行。Service与...
2. ** UriMatcher**:这个工具类用于匹配不同的URI请求。你需要为每种类型的请求(如获取所有数据、获取单个数据、插入、更新、删除等)定义一个匹配码,并在`UriMatcher.addURI()`中注册。 3. **增删改查方法**:...
UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH); matcher.addURI("com.example.myapp", "items", 1); // 匹配items路径 matcher.addURI("com.example.myapp", "items/#", 2); // 匹配单个item ``` ...
通过这个示例,开发者可以学习到如何设计数据模型,构建Contract类,实现ContentProvider的生命周期方法,以及如何使用ContentResolver进行数据操作。掌握这些知识对于构建能够与其他应用有效协作的Android应用至关...
1. **定义UriMatcher**: UriMatcher是一个工具类,用于解析输入的Uri并返回匹配的代码。在ContentProvider中,我们需要为每种类型的操作(例如查询、插入、更新和删除)以及每个数据表定义一个唯一的代码。例如,...
2. **Uri匹配**:定义UriMatcher类来匹配不同的Uri请求,这将使代码更清晰。例如: ```java private static final int MATCH_ITEM = 1; private static final int MATCH_ALL = 2; private static UriMatcher ...
`UriMatcher`是一个辅助类,用于解析和匹配URI,帮助确定调用哪个`ContentProvider`的方法。它可以通过添加模式来预先配置,然后在处理URI时返回匹配的代码,这样可以提高效率并减少错误。 此外,`Cursor`是`...
此外,`UriMatcher`是用于识别不同URI请求的工具,它确保了对内容的正确操作。 其次,`SQLite`数据库是Android中存储结构化数据的首选方式。在这个通讯录应用中,我们可能创建了一个名为`Contacts.db`的SQLite...
ContentProviderSampler的实现中,我们通常会定义一个ContentProvider类,该类实现了上述的数据库操作方法,并通过UriMatcher进行URI匹配,确定具体的操作。UriMatcher是一个工具类,它可以根据输入的URI匹配预定义...
2. UriMatcher:用于匹配不同的URI请求,确定执行的操作。 3. SQLiteHelper:创建和管理SQLite数据库,包含表的创建、升级等操作。 4. 数据模型类:定义媒体数据的实体类,如MediaItem,用于数据的封装和解析。 五...
一个ContentProvider由四个主要部分组成:`UriMatcher`、`SQLiteOpenHelper`(或其它数据管理类)、`ContentResolver`和`Provider`类。`UriMatcher`用于匹配不同的URI请求,`SQLiteOpenHelper`处理数据库的创建和...