首页 > 代码库 > Android学习笔记二十.使用ContentProvider实现数据共享(二).URI...工具类
Android学习笔记二十.使用ContentProvider实现数据共享(二).URI...工具类
一、UriMatcher与ContentUris工具类3.ContentUris工具类的使用
1.URI (public final class)
升华笔记一:
(3)Absolute vs. Relative URIs
(5)编码和解码URI
2.Uri (public abstract class)(1)ContentProvider要求的Uri
升华笔记二:Android的Uri所能表达的功能更丰富
(2)Uri嵌入类
(3)常用方法
UriMatcher
1.功能概述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
用于操作Uri字符串的工具类。
2.主要方法withAppendedId(Uri,id):用于为路径加上ID部分
parseId(uri):用于从指定Uri中解析出所包含的ID值
(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
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)
Component | Example value | Also 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:网站资源部分。房访问这需要访问不同资源时,这个部分总是改变的。
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 URIsAbsolute 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
Component | Example value |
---|---|
Scheme | mailto |
Scheme-specific part(不是斜杠‘/‘开头) | robots@example.com |
Fragment |
解码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%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" |
java.lang.Object
? java.net.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节点。Nested Classes | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
class | Uri.Builder | Helper class for building or manipulating URI references. |
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...工具类
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。