您的位置:首页 > 移动开发 > Android开发

Android学习笔记十六.使用ContentProvider实现数据共享(二).URI...工具类

2015-01-07 21:50 549 查看
转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空)

一、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
spec
.
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:password@host:8080/directory/file?query#fragment)

ComponentExample valueAlso known as
Scheme(方案/协议)
http
protocol
Scheme-specific
 part
//username:password@host:8080/directory/file?query#fragment
Authority(身份认证)
username:password@host:8080
User
 Info(用户信息)
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)方法进行相互转换。

[code]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
 or hierarchical
. Relative URIs are always hierarchical.

Hierarchical:
http://android.com/robots.txt

Opaque:
mailto:robots@example.com


Opaque URIs同时也包含scheme和scheme-specific
part,但是需要注意的是其scheme-specific part不是以斜杠'/'开头并且不能被解析,所有一个opaque URI是没有authority, user info, host, port, path or query这几部分的。一个典型的opaque URI: mailto:robots@example.com

ComponentExample value
Scheme
mailto
Scheme-specific part(不是斜杠'/'开头)
robots@example.com
Fragment
(5)编码和解码URI

解码URI:http : //user:pa55w%3Frd@host:80/doc%7Csearch?q=green%20robots#over%206%22

ComponentLegal Characters(合法字符)Other Constraints

(其他限制条件)
Raw Value(原始值)Value(解码得到的值)
Scheme
0-9
,
a-z
,
A-Z
,
+-.
First character must be in
a-z
,
A-Z
http
Scheme-specific part
0-9
,
a-z
,
A-Z
,
_-!.~'()*,;:$&+=?/[]@
Non-ASCII characters okay

(非ASCII字符即可)
//user:pa55w%3Frd@host:80/doc%7Csearch?q=green%20robots
//user:pa55w?rd@host:80/doc|search?q=green robots
Authority
0-9
,
a-z
,
A-Z
,
_-!.~'()*,;:$&+=@[]
Non-ASCII characters okay
user:pa55w%3Frd@host:80
user:pa55w?rd@host: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.BuilderHelper 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: