`
liyf155
  • 浏览: 128314 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

UriMatcher类的学习

阅读更多

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,当匹配成功时则codeURI可以是精确的字符串,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 size0uriAuthoritynull则返回默认值(此默认值在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和URI使用指南

    通过本指南的学习,我们可以了解到 `URL` 类在Java中提供了强大的功能来定位和获取网络资源。通过理解URL的基本组成以及如何创建和使用URL对象,开发者可以更高效地利用Java来访问网络上的各种资源。此外,了解如何...

    Android学习之通过content provider获得联系人

    2. **UriMatcher类**:用于匹配URI,确定应该调用哪个方法来处理请求。通过添加代码,我们可以为不同的操作(例如读取、写入)设置不同的URI模式。 3. **数据库操作类**:通常是一个SQLiteOpenHelper子类,用于管理...

    Android学习之手机通讯录

    ContentProvider是一个抽象类,它为其他应用程序提供访问应用程序私有数据的方式。Android系统中,包括通讯录、媒体文件等系统数据都是通过ContentProvider进行访问的。开发者可以通过自定义ContentProvider来暴露...

    安卓学习笔记

    在实现ContentProvider时,你需要在AndroidManifest.xml清单文件中声明它,并定义匹配URI的类,例如UriMatcher。UriMatcher的addUri()方法用于添加URI模式,而withAppendedId()可以帮助构建包含ID的URI。当需要访问...

    ContentProvider完整例子

    你需要定义一个UriMatcher类,用于匹配不同的Uri请求。 2. 创建ContentProvider类:继承自ContentProvider抽象类,重写其中的关键方法,如query(), insert(), update(), delete()以及getType()。这些方法分别对应对...

    xamarin学习笔记A11(安卓ContentProvider)

    - 在Xamarin中,创建ContentProvider需要继承自Android.Content.Provider.ContentProvider类,并重写其关键方法,如OnCreate、Insert、Query、Update、Delete等。 - 需要在AndroidManifest.xml中声明...

    Android之ContentProvider事例

    首先,ContentProvider的基本结构包括四个关键组件:`ContentContract`(内容契约类)、`ContentProvider`(内容提供者类)、`ContentResolver`(内容解析器)和`UriMatcher`(URI匹配器)。`ContentContract`定义了...

    ContentProvider使用

    由于 URI 可能包含多种不同的路径,为了更方便地处理不同的 URI 路径,Android 提供了 `UriMatcher` 类来帮助匹配 URI。 1. **创建 UriMatcher 对象** ```java UriMatcher matcher = new UriMatcher(UriMatcher....

    Android 通讯录源代码(学习)

    你需要查看源代码中的`ContactProvider`类,了解如何实现`UriMatcher`、`CursorLoader`和`ContentResolver`的交互。 3. **联系人UI**: 通讯录界面一般包含一个列表视图,显示联系人的名字和电话号码。源代码可能...

    android四大组件简介学习教案.pptx

    开发者可以使用UriMatcher类来解析和处理不同的数据请求。 3. **Service(服务)** Service是在后台运行的无用户界面组件,用于执行长时间运行的任务,即使用户切换到其他应用,Service也会继续运行。Service与...

    博客&lt;ContentProvider数据库共享之 实例讲解&gt;对应源码

    2. ** UriMatcher**:这个工具类用于匹配不同的URI请求。你需要为每种类型的请求(如获取所有数据、获取单个数据、插入、更新、删除等)定义一个匹配码,并在`UriMatcher.addURI()`中注册。 3. **增删改查方法**:...

    ContentProvider的快速上手策略

    UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH); matcher.addURI("com.example.myapp", "items", 1); // 匹配items路径 matcher.addURI("com.example.myapp", "items/#", 2); // 匹配单个item ``` ...

    ContentProviderDemo.rar

    通过这个示例,开发者可以学习到如何设计数据模型,构建Contract类,实现ContentProvider的生命周期方法,以及如何使用ContentResolver进行数据操作。掌握这些知识对于构建能够与其他应用有效协作的Android应用至关...

    Android中ContentProvider的示例

    1. **定义UriMatcher**: UriMatcher是一个工具类,用于解析输入的Uri并返回匹配的代码。在ContentProvider中,我们需要为每种类型的操作(例如查询、插入、更新和删除)以及每个数据表定义一个唯一的代码。例如,...

    android contentprovider的使用

    2. **Uri匹配**:定义UriMatcher类来匹配不同的Uri请求,这将使代码更清晰。例如: ```java private static final int MATCH_ITEM = 1; private static final int MATCH_ALL = 2; private static UriMatcher ...

    Android部分源码——content包

    `UriMatcher`是一个辅助类,用于解析和匹配URI,帮助确定调用哪个`ContentProvider`的方法。它可以通过添加模式来预先配置,然后在处理URI时返回匹配的代码,这样可以提高效率并减少错误。 此外,`Cursor`是`...

    android 的简单通讯录管理程序,供学习

    此外,`UriMatcher`是用于识别不同URI请求的工具,它确保了对内容的正确操作。 其次,`SQLite`数据库是Android中存储结构化数据的首选方式。在这个通讯录应用中,我们可能创建了一个名为`Contacts.db`的SQLite...

    ContentProviderSampler

    ContentProviderSampler的实现中,我们通常会定义一个ContentProvider类,该类实现了上述的数据库操作方法,并通过UriMatcher进行URI匹配,确定具体的操作。UriMatcher是一个工具类,它可以根据输入的URI匹配预定义...

    Android应用源码之MediaProviderSample-IT计算机-毕业设计.zip

    2. UriMatcher:用于匹配不同的URI请求,确定执行的操作。 3. SQLiteHelper:创建和管理SQLite数据库,包含表的创建、升级等操作。 4. 数据模型类:定义媒体数据的实体类,如MediaItem,用于数据的封装和解析。 五...

    ContentProviderTest.zip

    一个ContentProvider由四个主要部分组成:`UriMatcher`、`SQLiteOpenHelper`(或其它数据管理类)、`ContentResolver`和`Provider`类。`UriMatcher`用于匹配不同的URI请求,`SQLiteOpenHelper`处理数据库的创建和...

Global site tag (gtag.js) - Google Analytics