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:[email protected]:8080/directory/file?query#fragment)

Component Example value Also known as
Scheme(方案/协议) http protocol
Scheme-specific
part
//username:[email protected]:8080/directory/file?query#fragment
Authority(身份认证) username:[email protected]: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)方法进行相互转换。

  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:[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-9a-zA-Z+-. First character must be ina-zA-Z http
Scheme-specific part 0-9a-zA-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-9a-zA-Z_-!.~‘()*,;:$&+[email protected][] Non-ASCII characters okay user:pa55w%[email protected]:80 user:[email protected]:80
User Info 0-9a-zA-Z_-!.~‘()*,;:$&+= Non-ASCII characters okay user:pa55w%3Frd user:pa55w?rd
Host 0-9a-zA-Z-.[] Domain name, IPv4 address or [IPv6 address] host
Port 0-9 80
Path 0-9a-zA-Z_-!.~‘()*,;:$&+
=/@
Non-ASCII characters okay /doc%7Csearch /doc|search
Query 0-9a-zA-Z_-!.~‘()*,;:$&+=?/[]@ Non-ASCII characters okay q=green%20robots q=green robots
Fragment 0-9a-zA-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

时间: 2024-08-24 12:53:13

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

MySQL数据库学习笔记(十)----JDBC事务处理、封装JDBC工具类

首先需要回顾一下上一篇文章中的内容:MySQL数据库学习笔记(九)----JDBC的PreparedStatement接口重构增删改查 一.JDBC事务处理: 我们已经知道,事务的概念即:所有的操作要么同时成功,要么同时失败.在MySQL中提供了Commit.Rollback命令进行事务的提交与回滚.实际上在JDBC中也存在事务处理,如果要想进行事务处理的话,则必须按照以下的步骤完成. JDBC中事务处理的步骤: 1.要取消掉JDBC的自动提交:void setAutoCommit(boolea

Android学习笔记(十二)——使用意图传递数据的几种方式

使用意图传递数据的几种方式 点此获取完整代码 我们除了要从活动返回数据,也常常要传递数据给活动.对此我们可以使用Intent对象将这些数据传递给目标活动. 1.创建一个名为PassingData的项目,在activity_main.xml文件中添加一个Button: <Button android:id="@+id/btn_SecondActivity" android:layout_width="fill_parent" android:layout_hei

Android学习笔记(十四)——在运行时添加碎片(附源码)

在运行时添加碎片 点击获取源码 将UI分割为多个可配置的部分是碎片的优势之一,但其真正强大之处在于可在运行时动态地把它们添加到活动中. 1.使用上一篇创建的Fragments项目,在main.xml文件中注释掉两个<fragment>元素: 2.在FragmentActivity.java中添加下面的代码: FragmentManager fragmentManager = getSupportFragmentManager();//向活动添加碎片 FragmentTransaction fr

Android学习笔记(十五)——碎片的生命周期(附源码)

碎片的生命周期 点击下载源码 与活动类似,碎片具有自己的生命周期.理解了碎片的生命周期后,我们可以在碎片被销毁时正确地保存其实例,在碎片被重建时将其还原到前一个状态. 1.使用上一篇的项目Fragments,在Fragment1.java文件中添加如下代码: package net.zenail.Fragments; import android.app.Activity; import android.os.Bundle; import android.support.v4.app.Fragm

Android学习笔记(十六)——碎片之间进行交互(附源码)

碎片之间进行交互 点击下载源码 很多时候,一个活动中包含一个或者多个碎片,它们彼此协作,向用户展示一个一致的UI.在这种情况下,碎片之间能进行通信并交换数据十分重要. 1.使用上一篇中创建的同一个项目,在fragment.xml中添加TextView的标识id: android:id="@+id/lblFragment1" 2.在fragment2.xml中添加一个Button,用于与fragment1进行交互: <Button android:id="@+id/btn

Android学习笔记(十八)——使用意图筛选器和实现浏览网页(附源码)

使用意图筛选器 点击下载源码 1.创建一个Intents项目,给该项目添加一个新类,命名为MyBrowserActivity,在res/layout文件夹下新增一个browser.xml: 2.在AndroidManifest.xml文件中添加如下代码: 添加权限: <uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="a

Android学习笔记(十)——使用意图链接活动

使用意图链接活动 1.新建一个名为"UsingIntent"的项目,右击src文件夹下的包名,选择New-->Class选项,并将新的类文件名命名为"SecondActivity": 2.打开AndroidManifest.xml文件,添加如下代码: <activity android:name=".SecondActivity" android:label="Second Activity" > <!

【转】 Pro Android学习笔记(十九):用户界面和控制(7):ListView

目录(?)[-] 点击List的item触发 添加其他控件以及获取item数据 ListView控件以垂直布局方式显示子view.系统的android.app.ListActivity已经实现了一个只含有一个ListView的Activity,并通过setListAdapter()方法来管理adapter.我们可以通过扩展ListActivity来实现. 我们要在整个屏幕上显示ListView,我们直接继承使用ListActivity,不需要在定义自己的layout XML文件,我们在上一学习中

Pro Android学习笔记(十二):了解Intent(下)

解析Intent,寻找匹配Activity 如果给出component名字(包名.类名)是explicit intent,否则是implicit intent.对于explicit intent,关键就是component 名字,在<intent-fliter>中声明的其他属性被忽略.对于implicit intent,则根据action,category和data来进行匹配.然而一个intent fliter中可以声明多个actions,多个categories,多个data属性,因此可以满