首页 > 代码库 > Android学习笔记二十.使用ContentProvider实现数据共享(二).URI...工具类

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

一、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(方案/协议)httpprotocol
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

Queryquery

Fragment(资源名称)fragmentref

升华笔记一:
举例:在浏览器中输入如下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 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
Schememailto
Scheme-specific part(不是斜杠‘/‘开头)robots@example.com
Fragment
(5)编码和解码URI
    解码URI:http : //user:pa55w%3Frd@host80/doc%7Csearch?q=green%20robots#over%206%22
ComponentLegal Characters(合法字符)Other Constraints
(其他限制条件)
Raw Value(原始值)Value(解码得到的值)
Scheme0-9, a-z, A-Z, +-.First character must be ina-z, A-Z

http
Scheme-specific part0-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
Authority0-9, a-z, A-Z, _-!.~‘()*,;:$&+=@[]Non-ASCII characters okayuser:pa55w%3Frd@host:80user:pa55w?rd@host:80
User Info0-9, a-z, A-Z, _-!.~‘()*,;:$&+=Non-ASCII characters okayuser:pa55w%3Frduser:pa55w?rd
Host0-9, a-z, A-Z, -.[]Domain name, IPv4 address or [IPv6 address]

host
Port0-9


80
Path0-9, a-z, A-Z, _-!.~‘()*,;:$&+ =/@Non-ASCII characters okay/doc%7Csearch/doc|search
Query0-9, a-z, A-Z, _-!.~‘()*,;:$&+=?/[]@Non-ASCII characters okayq=green%20robotsq=green robots
Fragment0-9, a-z, A-Z, _-!.~‘()*,;:$&+=?/[]@Non-ASCII characters okayover%206%22over 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

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