- 浏览: 828020 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
renzhengzhi:
请教一下楼主,公有云和私有云的开发,具体要做哪些工作呢?我拿到 ...
4,云的4 种模式 -
SangBillLee:
我用了solr5.5,用SolrQuery查询,没法高亮,不知 ...
solr5.x快速入门 -
lw900925:
这翻译读起来真是别扭。
solr in action翻译-第一章1.1 -
springjpa_springmvc:
spring mvc demo教程源代码下载,地址:http: ...
Spring MVC性能提升 -
h416373073:
正遇到了此问题不知如何解决, 多谢分享
solr错误
UriMatcher类
在Content Provider中该类帮助匹配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。
1.Uri 通用资源标志符(Universal Resource Identifier, 简称"URI")。 Uri代表要操作的数据,Android上可用的每种资源 - 图像、视频片段等都可以用Uri来表示。 URI一般由三部分组成: 访问资源的命名机制。 存放资源的主机名。 资源自身的名称,由路径表示。 Android的Uri由以下三部分组成: "content://"、数据的路径、标示ID(可选) 举些例子,如: 所有联系人的Uri: content://contacts/people 某个联系人的Uri: content://contacts/people/5 所有图片Uri: content://media/external 某个图片的Uri:content://media/external/images/media/4 我们很经常需要解析Uri,并从Uri中获取数据。 Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher 和ContentUris 。 虽然这两类不是非常重要,但是掌握它们的使用,会便于我们的开发工作。 下面就一起看一下这两个类的作用。 2.UriMatcher UriMatcher 类主要用于匹配Uri. 使用方法如下。 首先第一步,初始化: 1. UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH); [java] view plaincopyprint? 1. UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
第二步注册需要的Uri:
1. matcher.addURI("com.yfz.Lesson", "people", PEOPLE);
2. matcher.addURI("com.yfz.Lesson", "person/#", PEOPLE_ID);
[java] view plaincopyprint?
1. matcher.addURI("com.yfz.Lesson", "people", PEOPLE);
2. matcher.addURI("com.yfz.Lesson", "person/#", PEOPLE_ID);
第三部,与已经注册的Uri进行匹配:
1. Uri uri = Uri.parse("content://" + "com.yfz.Lesson" + "/people");
2. int match = matcher.match(uri);
3. switch (match)
4. {
5. case PEOPLE:
6. return "vnd.android.cursor.dir/people";
7. case PEOPLE_ID:
8. return "vnd.android.cursor.item/people";
9. default:
10. return null;
11. }
[java] view plaincopyprint?
1. Uri uri = Uri.parse("content://" + "com.yfz.Lesson" + "/people");
2. int match = matcher.match(uri);
3. switch (match)
4. {
5. case PEOPLE:
6. return "vnd.android.cursor.dir/people";
7. case PEOPLE_ID:
8. return "vnd.android.cursor.item/people";
9. default:
10. return null;
11. }
match方法匹配后会返回一个匹配码Code,即在使用注册方法addURI时传入的第三个参数。
上述方法会返回"vnd.android.cursor.dir/person".
总结:
--常量 UriMatcher.NO_MATCH 表示不匹配任何路径的返回码
--# 号为通配符
--* 号为任意字符
另外说一下,官方SDK说明中关于Uri的注册是这样写的:
1. private static final UriMatcher sURIMatcher = new UriMatcher();
2. static
3. {
4. sURIMatcher.addURI("contacts", "/people", PEOPLE);
5. sURIMatcher.addURI("contacts", "/people/#", PEOPLE_ID);
6. sURIMatcher.addURI("contacts", "/people/#/phones", PEOPLE_PHONES);
7. sURIMatcher.addURI("contacts", "/people/#/phones/#", PEOPLE_PHONES_ID);
8. sURIMatcher.addURI("contacts", "/people/#/contact_methods", PEOPLE_CONTACTMETHODS);
9. sURIMatcher.addURI("contacts", "/people/#/contact_methods/#", PEOPLE_CONTACTMETHODS_ID);
10. sURIMatcher.addURI("contacts", "/deleted_people", DELETED_PEOPLE);
11. sURIMatcher.addURI("contacts", "/phones", PHONES);
12. sURIMatcher.addURI("contacts", "/phones/filter/*", PHONES_FILTER);
13. sURIMatcher.addURI("contacts", "/phones/#", PHONES_ID);
14. sURIMatcher.addURI("contacts", "/contact_methods", CONTACTMETHODS);
15. sURIMatcher.addURI("contacts", "/contact_methods/#", CONTACTMETHODS_ID);
16. sURIMatcher.addURI("call_log", "/calls", CALLS);
17. sURIMatcher.addURI("call_log", "/calls/filter/*", CALLS_FILTER);
18. sURIMatcher.addURI("call_log", "/calls/#", CALLS_ID);
19. }
[java] view plaincopyprint?
1. private static final UriMatcher sURIMatcher = new UriMatcher();
2. static
3. {
4. sURIMatcher.addURI("contacts", "/people", PEOPLE);
5. sURIMatcher.addURI("contacts", "/people/#", PEOPLE_ID);
6. sURIMatcher.addURI("contacts", "/people/#/phones", PEOPLE_PHONES);
7. sURIMatcher.addURI("contacts", "/people/#/phones/#", PEOPLE_PHONES_ID);
8. sURIMatcher.addURI("contacts", "/people/#/contact_methods", PEOPLE_CONTACTMETHODS);
9. sURIMatcher.addURI("contacts", "/people/#/contact_methods/#", PEOPLE_CONTACTMETHODS_ID);
10. sURIMatcher.addURI("contacts", "/deleted_people", DELETED_PEOPLE);
11. sURIMatcher.addURI("contacts", "/phones", PHONES);
12. sURIMatcher.addURI("contacts", "/phones/filter/*", PHONES_FILTER);
13. sURIMatcher.addURI("contacts", "/phones/#", PHONES_ID);
14. sURIMatcher.addURI("contacts", "/contact_methods", CONTACTMETHODS);
15. sURIMatcher.addURI("contacts", "/contact_methods/#", CONTACTMETHODS_ID);
16. sURIMatcher.addURI("call_log", "/calls", CALLS);
17. sURIMatcher.addURI("call_log", "/calls/filter/*", CALLS_FILTER);
18. sURIMatcher.addURI("call_log", "/calls/#", CALLS_ID);
19. }
这个说明估计已经是Google官方没有更新,首先是初始化方法,没有传参,那么现在初始化时,实际是必须传参的。 可以看一下Android2.2的源码,无参数的构造方法已经是private的了。
另外就是addURI这个方法,第二个参数开始时不需要"/", 否则是无法匹配成功的。
3.ContentUris
ContentUris 类用于获取Uri路径后面的ID部分
1)为路径加上ID: withAppendedId(uri, id)
比如有这样一个Uri
1. Uri uri = Uri.parse("content://com.yfz.Lesson/people")
[java] view plaincopyprint?
1. Uri uri = Uri.parse("content://com.yfz.Lesson/people")
通过withAppendedId方法,为该Uri加上ID
1. Uri resultUri = ContentUris.withAppendedId(uri, 10);
[java] view plaincopyprint?
1. Uri resultUri = ContentUris.withAppendedId(uri, 10);
最后resultUri为: content://com.yfz.Lesson/people/10
2)从路径中获取ID: parseId(uri)
1. Uri uri = Uri.parse("content://com.yfz.Lesson/people/10")
2. long personid = ContentUris.parseId(uri);
[java] view plaincopyprint?
1. Uri uri = Uri.parse("content://com.yfz.Lesson/people/10")
2. long personid = ContentUris.parseId(uri);
最后personid 为 :10
附上实验的代码:
1. package com.yfz;
2. import com.yfz.log.Logger;
3. import android.app.Activity;
4. import android.content.ContentUris;
5. import android.content.UriMatcher;
6. import android.net.Uri;
7. import android.os.Bundle;
8. public class Lesson_14 extends Activity {
9.
10. private static final String AUTHORITY = "com.yfz.Lesson";
11. private static final int PEOPLE = 1;
12. private static final int PEOPLE_ID = 2;
13.
14. //NO_MATCH表示不匹配任何路径的返回码
15. private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);
16. static
17. {
18. sURIMatcher.addURI(AUTHORITY, "people", PEOPLE);
19.
20. //这里的#代表匹配任意数字,另外还可以用*来匹配任意文本
21. sURIMatcher.addURI(AUTHORITY, "people/#", PEOPLE_ID);
22. }
23.
24. @Override
25. protected void onCreate(Bundle savedInstanceState) {
26. super.onCreate(savedInstanceState);
27. Logger.d("------ Start Activity !!! ------");
28.
29. Uri uri1 = Uri.parse("content://" + AUTHORITY + "/people");
30. Logger.e("Uri:" + uri1);
31. Logger.d("Match 1" + getType(uri1));
32.
33. Uri uri2 = Uri.parse("content://" + AUTHORITY + "/people" + "/2");
34.
35. Logger.e("Uri:" + uri2);
36. Logger.d("Match 2" + getType(uri2));
37.
38. //拼接Uri
39. Uri cUri = ContentUris.withAppendedId(uri1, 15);
40. Logger.e("Uri:" + cUri);
41. //获取ID
42. long id = ContentUris.parseId(cUri);
43. Logger.d("Uri ID: " + id);
44. }
45.
46. private String getType(Uri uri) {
47. int match = sURIMatcher.match(uri);
48. switch (match)
49. {
50. case PEOPLE:
51. return "vnd.android.cursor.dir/person";
52. case PEOPLE_ID:
53. return "vnd.android.cursor.item/person";
54. default:
55. return null;
56. }
57. }
58. }
发表评论
-
Android SDK更新 Connection to http://dl-ssl.google.com refused 解决方法 .
2013-10-10 11:38 1186问题描述使用SDK Manager ... -
android 对话框中的进度条 (ProgressDialog)
2012-03-10 00:16 2562显然要定义对话框进 ... -
Android开发学习笔记WebView
2012-02-28 21:59 5118WebView(网络视图)能加载 ... -
Android ListView理解之BaseAdapter .
2012-02-28 21:43 2042ListView是Android开发过程中较为常见的组件之一, ... -
AsyncTask的用法
2012-02-27 21:36 887在开发Android应用时必须遵守单线程模型的原则: An ... -
android中的ellipsize
2012-02-26 17:47 1065最近为了解决某个bug,textview中内容过长的话自动 ... -
BaseExpandableListAdapter
2012-02-26 17:40 1550转载自:中国手机开 ... -
使用命令安装apk的方法
2012-02-26 15:44 1690使用命令安装apk的方法, 第一步,将应用防止在androi ... -
Android PendingIntent和Intent的区别
2012-02-16 22:39 1723以前在学习AlarmManager里面会遇到PendingI ... -
android中gallery的使用
2012-02-13 22:52 25131,创建配置文件 <?xml version=&quo ... -
android的tabHost的使用
2012-02-13 22:10 1565废话不多,直接介绍怎么使用 1,用几个tab,就建立几个ta ... -
android源码解析之二ApplicaitonInfo和PackageManager
2012-02-07 13:26 2247ApplicationInfo ApplicationIn ... -
android源码解读一(Context)
2012-02-05 21:13 4249Context类 Context是一个抽象类 public ... -
android 属性android:visibility
2012-02-05 12:16 936此属性意思是此视图是否显示, 例如RelativeLayou ... -
android默认焦点设置的方法
2012-02-05 12:13 18909在使用到文本框(EditText)来进行数据录入的时候,有时默 ... -
imageView.setScaleType
2012-02-03 17:36 5988imageView.setScaleType(ImageVie ... -
文件在SD卡存储
2012-02-02 10:47 1757手机的存储空间分俩种,一种是手机自带的,另一种是SD卡,(外存 ... -
广播接收者
2012-02-02 10:45 1213广播接受者(BroadcastReceiv ... -
android的服务
2012-02-02 10:45 976服务android中服务和window中的服务是类似的东西,服 ... -
android资源的应用
2012-02-02 10:43 1457color颜色在配置文件中定义路径:res/values/co ...
相关推荐
ContentObserver——内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,...熟悉Content Provider(内容提供者)的应该知道,我们可以通过UriMatcher类注册不同类型的Uri,我们可以通过这些不同的 Uri来查询不同
URL和URI的使用的方法。获取网络上的数据。
Android数据共享概述 ContentProvider注册/实现 UriMatcher/ContentUris 系统ContentProvider 联系人 系统设置…
private static final UriMatcher URI_MATCHER=new UriMatcher(UriMatcher.NO_MATCH); private final String TAG="provider"; private static final String authority="com.example.tigongzhe.provider"; static...
PersonContentProvider内容提供者类 package com.ljq.db; import android.content.ContentProvider; import android.content.ContentUris; import android.content.ContentValues; import android.content....
android Contentprovider的使用demo 所创建工程为andorid5.0环境,里面有四个工程,为了证明共享所以有两个程序,eclipse版本低的自己新建工程把 ContentProvider2,androidContentProvider两个工程里面拷贝出来就...
UriMatcher localUriMatcher = new UriMatcher(-1); t = localUriMatcher; localUriMatcher.addURI("com.qihoo360.mobilesafeguard", "blacklist", 1); t.addURI("com.qihoo360.mobilesafeguard", "blacklist/#...
Android中ContentProvider的示例,详细可以参见博客:http://www.cnblogs.com/plokmju/p/android_ContentProvider.html
ContentProvider远程数据操作(1.0).zip ContentProvider远程数据操作(1.0).zip ContentProvider远程数据操作(1.0).zip ContentProvider远程数据操作(1.0).zip ContentProvider远程数据操作(1.0).zip