Android 中ContentProvider和Uri详解(2)

二、Uri介绍
 
Uri代表了要操作的数据,Uri主要包含了两部分信息:1》需要操作的ContentProvider ,2》对ContentProvider中的什么数据进行操作,一个Uri由以下几部分组成:   

01.jpg

ContentProvider(内容提供者)的scheme已经由Android所规定, scheme为:content://
 主机名(或叫Authority)用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。
 路径(path)可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:
 要操作person表中id为10的记录,可以构建这样的路径:/person/10
 要操作person表中id为10的记录的name字段, person/10/name
 要操作person表中的所有记录,可以构建这样的路径:/person
 要操作xxx表中的记录,可以构建这样的路径:/xxx
 当然要操作的数据不一定来自数据库,也可以是文件、xml或网络等其他存储方式,如下:
 要操作xml文件中person节点下的name节点,可以构建这样的路径:/person/name
 如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下:
 Uri uri = Uri.parse("content://com.ljq.provider.personprovider/person")
 
三、UriMatcher类使用介绍
 
因为Uri代表了要操作的数据,所以我们经常需要解析Uri,并从Uri中获取数据。Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher和ContentUris 。掌握它们的使用,会便于我们的开发工作。
 UriMatcher类用于匹配Uri,它的用法如下:
 首先第一步把你需要匹配Uri路径全部给注册上,如下:

//常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码
UriMatcher sMatcher =new UriMatcher(UriMatcher.NO_MATCH);
//如果match()方法匹配content://com.ljq.provider.personprovider/person路径,返回匹配码为1
sMatcher.addURI("com.ljq.provider.personprovider", "person", 1);//添加需要匹配uri,如果匹配就会返回匹配码
//如果match()方法匹配content://com.ljq.provider.personprovider/person/230路径,返回匹配码为2
sMatcher.addURI("com.ljq.provider.personprovider", "person/#", 2);//#号为通配符
switch (sMatcher.match(Uri.parse("content://com.ljq.provider.personprovider/person/10"))) {
case1
break;
case2
break;
default://不匹配
break;
}

注册完需要匹配的Uri后,就可以使用sMatcher.match(uri)方法对输入的Uri进行匹配,如果匹配就返回匹配码,匹配码是调用addURI()方法传入的第三个参数,假设匹配content://com.ljq.provider.personprovider/person路径,返回的匹配码为1

四、ContentUris类使用介绍

ContentUris类用于操作Uri路径后面的ID部分,它有两个比较实用的方法:

withAppendedId(uri, id)用于为路径加上ID部分:

Uri uri = Uri.parse("content://com.ljq.provider.personprovider/person")
Uri resultUri
= ContentUris.withAppendedId(uri, 10);
//生成后的Uri为:content://com.ljq.provider.personprovider/person/10

parseId(uri)方法用于从路径中获取ID部分:

Uri uri = Uri.parse("content://com.ljq.provider.personprovider/person/10")
long personid = ContentUris.parseId(uri);//获取的结果为:10

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/c1e954bc70ec8c712b0c6f8c39352916.html