一、UriMatcher与ContentUris工具类
UriMatcher
1.功能概述
开发ContentProvider时所实现的query()、insert()、delete()、update()方法的第一个参数为Uri参数,该参数由ContentResolver调用这些方法时传入。在上一篇博文中的实例,并没有真正对数据进行操作,因此ContentProvider并未对Uri参数进行任何判断。所以为了确定该ContentProvider实际能处理的Uri,以确定每个方法中Uri参数所操作的数据,Android系统提供了UriMatcher工具类。
2.主要方法
void addUri(String authority,String path,int
code):该方法用于向UriMatcher对象注册Uri。其中,authority和path组合成一个Uri,而code则代表该Uri对应的标识码
int match(Uri uri):根据前面注册的Uri来判断指定Uri对应的标识码。如果找不到匹配的标识码,该方法将会返回-1。
3.UriMatcher工具类的使用
(1)创建UriMatcher对象,并向其注册两个Uri.
UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
matcher.addUri("com.example.Android.Content_3","words",1);
//资源部分为words,即访问所有数据项
matcher.addUri("com.example.Android.Content_3","word/#",2);//访问指定数据项
com.example.Android.Content_3/words
(2)根据前面注册的Uri来判断指定Uri对应的标识码
com.example.Android.Content_3/words
matcher.match("Uri.parse("
matcher.match("Uri.parse("com.example.Android.Content_3/word/10"));
ContentUris
1.功能概述
用于操作Uri字符串的工具类。
2.主要方法
withAppendedId(Uri,id):用于为路径加上ID部分
parseId(uri):用于从指定Uri中解析出所包含的ID值
3.ContentUris工具类的使用
(1)为Uri添加ID,生成后的uri为“content://com.example.Android.Content_3/word/2”
Uri uri = Uri.parse("content://com.example.Android.Content_3/word");
Uri resultUri = ContentUris.withAppendedId(uri,2);
(2)从指定Uri中解析出所包含的ID值
Uri uri = Uri.parse("content://com.example.Android.Content_3/word/2");
long wordId=ContentUris.parseId(Uri); //获取的结果为2
二、URI与Uri
1.URI (public final class)
java.lang.Object
? java.net.URI
(1)功能概述:统一资源标识符,用于标识一个抽象或物理资源。同时,URI类不但可以用来解析一个URI字符串,也可以将几部分组成一个URI统一资源标识符。构造方法如下:
URI(String spec) Creates a new URI instance by parsing |
URI(String scheme, String schemeSpecificPart, String fragment) Creates a new URI instance of the given unencoded component parts. |
URI(String scheme, String userInfo, String host, int port, String path, String query, String fragment) Creates a new URI instance of the given unencoded component parts. |
URI(String scheme, String host, String path, String fragment) Creates a new URI instance of the given unencoded component parts. |
URI(String scheme, String authority, String path, String query, String fragment) Creates a new URI instance of the given unencoded component parts. |
(2)URI组成(如URI:http://username:[email protected]:8080/directory/file?query#fragment)
Component | Example value | Also known as |
---|---|---|
Scheme(方案/协议) |
http |
protocol |
Scheme-specific |
//username:[email protected]:8080/directory/file?query#fragment |
|
Authority(身份认证) |
username:[email protected]:8080 |
|
User |
username:password |
|
Host(主机) |
host |
|
Port(串口) |
8080 |
|
Path(资源路径) |
/directory/file |
|
Query |
query |
|
Fragment(资源名称) |
fragment |
ref |
升华笔记一:
举例:在浏览器中输入如下Uri:http://www.crazyit.org:80/ethos.php
对于上面的这个URL,可分为如下三个部分:
http://:URL的协议部分,只要通过HTTP协议来访问网站,这个部分是固定的;
www.crazyit.org:域名部分。只要访问指定的网站,这个部分总是固定的;
ethos.php:网站资源部分。房访问这需要访问不同资源时,这个部分总是改变的。
(3)Absolute vs. Relative URIs
URIs
are either absolute
.
or relative
- Absolute:
http://android.com/robots.txt
- Relative:
robots.txt
注意:
绝对URIs包含scheme部分,并且如果该scheme部分被URL支持的话,我们可以通过是同toURL()方法将绝对URI转换为URL;
相对URIs不包含scheme部分并且不能被转换为URLs,可以通过URI的resolve(String)方法、relativize(URI)方法进行相互转换。
URI absolute = new URI("http://android.com/");
URI relative = new URI("robots.txt");
URI resolved = new URI("http://android.com/robots.txt");
// print "http://android.com/robots.txt"
System.out.println(absolute.resolve(relative));
// print "robots.txt"
System.out.println(absolute.relativize(resolved));
(4) Opaque vs. Hierarchical URIs
Absolute URIs are either opaque
. Relative URIs are always hierarchical.
or hierarchical
- Hierarchical:
http://android.com/robots.txt
- Opaque:
mailto:[email protected]
Opaque URIs同时也包含scheme和scheme-specific
part,但是需要注意的是其scheme-specific part不是以斜杠‘/‘开头并且不能被解析,所有一个opaque URI是没有authority, user info, host, port, path or query这几部分的。一个典型的opaque URI: mailto:[email protected]
Component | Example value |
---|---|
Scheme |
mailto |
Scheme-specific part(不是斜杠‘/‘开头) |
[email protected] |
Fragment |
(5)编码和解码URI
解码URI:http : //user:pa55w%3Frd@host:80/doc%7Csearch?q=green%20robots#over%206%22
Component | Legal Characters(合法字符) |
Other Constraints
(其他限制条件) |
Raw Value(原始值) | Value(解码得到的值) |
---|---|---|---|---|
Scheme |
0-9 , a-z , A-Z , +-. |
First character must be ina-z , A-Z |
http |
|
Scheme-specific part |
0-9 , a-z , A-Z , _-!.~‘()*,;:$&+=?/[]@ |
Non-ASCII characters okay
(非ASCII字符即可) |
//user:pa55w%[email protected]:80/doc%7Csearch?q=green%20robots |
//user:[email protected]:80/doc|search?q=green robots |
Authority |
0-9 , a-z , A-Z , _-!.~‘()*,;:$&+[email protected][] |
Non-ASCII characters okay |
user:pa55w%[email protected]:80 |
user:[email protected]:80 |
User Info |
0-9 , a-z , A-Z , _-!.~‘()*,;:$&+= |
Non-ASCII characters okay |
user:pa55w%3Frd |
user:pa55w?rd |
Host |
0-9 , a-z , A-Z , -.[] |
Domain name, IPv4 address or [IPv6 address] | host | |
Port |
0-9 |
80 |
||
Path |
0-9 , a-z , A-Z , _-!.~‘()*,;:$&+ |
Non-ASCII characters okay |
/doc%7Csearch |
/doc|search |
Query |
0-9 , a-z , A-Z , _-!.~‘()*,;:$&+=?/[]@ |
Non-ASCII characters okay |
q=green%20robots |
q=green robots |
Fragment |
0-9 , a-z , A-Z , _-!.~‘()*,;:$&+=?/[]@ |
Non-ASCII characters okay |
over%206%22 |
over 6" |
2.Uri (public
abstract class)
java.lang.Object
? java.net.Uri
(1)ContentProvider要求的Uri
content://com.example.Android_Content_3/words
其可分为三个部分:
A.content://:这个部分是Android的ContentProvider规定的,就像上网的协议默认是http://一样。暴露ContentProvider、访问
ContentProvider的协议默认是content://。
B.com.example.Android_Content_3:这个部分就是COntentProvider的authority。系统就是由这个部分来找到操作哪个ContentProvider。只要访问指定的ContentProvider,这个部分总是固定的。
C.words:资源部分(数据部分)。当访问者需要访问不同资源时,这个部分是动态改变的。
升华笔记二:Android的Uri所能表达的功能更丰富
1.content://com.example.Android_Content_3/words
作用:访问资源为所有数据项words
2.content://com.example.Android_Content_3/word/2
作用:访问资源为word/2,即访问word数据中ID为2的记录
3.content://com.example.Android_Content_3/word/2/word
作用:访问资源为word/2,即访问word数据中ID为2的记录的word字段。
注意:虽然大部分使用ContentProvider所操作的数据都来自于数据库,但有时候这些数据也可来自于文件、XML或网络等其他存储放方式,此时支持的Uri也可以改为如下形式:content://com.example.Android_Content_3/word/detail/,该Uri表示操作word节点下的detail节点。
(2)Uri嵌入类
Nested Classes | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
class |
Uri.Builder | Helper class for building or manipulating URI references. |
(3)常用方法
static Uri parse(String uriString):将一个字符串转换成Uri
应用:Uri uri = Uri.parse("content://com.example.Android_Content_3/word/2");
参考:http://wear.techbrood.com/reference/java/net/URI.html