Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 558|回复: 0

【Android】Uri、UriMatcher、ContentUris详解-  Android学习

[复制链接]

该用户从未签到

发表于 2011-10-24 14:30:26 | 显示全部楼层 |阅读模式
1.Uri

通用资源标志符(Universal Resource Identifier, 简称"URI")。

Uri代表要操作的数据,Android上可用的每种资源 - 图像、视频片段等都可以用Uri来表示。

URI一般由三部分组成:

访问资源的命名机制。

存放资源的主机名。

资源自身的名称,由路径表示。


Android的Uri由以下三部分组成: "content://"、数据的路径、标示ID(可选)

举些例子,如:

所有联系人的Uri: content://contacts/people

某个联系人的Uri: content://contacts/people/5

所有图片Uri: content://media/external

某个图片的Uri:content://media/external/images/media/4


我们很经常需要解析Uri,并从Uri中获取数据。

Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher 和ContentUris 。

虽然这两类不是非常重要,但是掌握它们的使用,会便于我们的开发工作。

下面就一起看一下这两个类的作用。

2.UriMatcher

UriMatcher 类主要用于匹配Uri.

使用方法如下。

首先第一步,初始化:

java代码


UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);  
复制代码
第二步注册需要的Uri:


Java代码


matcher.addURI("com.yfz.Lesson", "people", PEOPLE);
复制代码
第三部,与已经注册的Uri进行匹配:


Java代码


Uri uri = Uri.parse("content://" + "com.yfz.Lesson" + "/people");

int match = matcher.match(uri);

       switch (match)

       {

           case PEOPLE:

               return "vnd.android.cursor.dir/people";

           case PEOPLE_ID:

               return "vnd.android.cursor.item/people";

           default:

               return null;

       }
复制代码match方法匹配后会返回一个匹配码Code,即在使用注册方法addURI时传入的第三个参数。

上述方法会返回"vnd.android.cursor.dir/person".

总结:

--常量 UriMatcher.NO_MATCH 表示不匹配任何路径的返回码

--# 号为通配符

--* 号为任意字符

另外说一下,官方SDK说明中关于Uri的注册是这样写的:


Java代码


private static final UriMatcher sURIMatcher = new UriMatcher();

    static

    {

        sURIMatcher.addURI("contacts", "/people", PEOPLE);

        sURIMatcher.addURI("contacts", "/people/#", PEOPLE_ID);

        sURIMatcher.addURI("contacts", "/people/#/phones", PEOPLE_PHONES);

        sURIMatcher.addURI("contacts", "/people/#/phones/#", PEOPLE_PHONES_ID);

        sURIMatcher.addURI("contacts", "/people/#/contact_methods", PEOPLE_CONTACTMETHODS);

        sURIMatcher.addURI("contacts", "/people/#/contact_methods/#", PEOPLE_CONTACTMETHODS_ID);

        sURIMatcher.addURI("contacts", "/deleted_people", DELETED_PEOPLE);

        sURIMatcher.addURI("contacts", "/phones", PHONES);

        sURIMatcher.addURI("contacts", "/phones/filter/*", PHONES_FILTER);

        sURIMatcher.addURI("contacts", "/phones/#", PHONES_ID);

        sURIMatcher.addURI("contacts", "/contact_methods", CONTACTMETHODS);

        sURIMatcher.addURI("contacts", "/contact_methods/#", CONTACTMETHODS_ID);

        sURIMatcher.addURI("call_log", "/calls", CALLS);

        sURIMatcher.addURI("call_log", "/calls/filter/*", CALLS_FILTER);

        sURIMatcher.addURI("call_log", "/calls/#", CALLS_ID);

    }
复制代码
这个说明估计已经是Google官方没有更新,首先是初始化方法,没有传参,那么现在初始化时,实际是必须传参的。 可以看一下Android2.2的源码,无参数的构造方法已经是private的了。

另外就是addURI这个方法,第二个参数开始时不需要"/", 否则是无法匹配成功的。

3.ContentUris

ContentUris 类用于获取Uri路径后面的ID部分

1)为路径加上ID: withAppendedId(uri, id)

比如有这样一个Uri

Java代码


Uri uri = Uri.parse("content://com.yfz.Lesson/people")
复制代码通过withAppendedId方法,为该Uri加上ID


Java代码


Uri resultUri = ContentUris.withAppendedId(uri, 10);
复制代码最后resultUri为: content://com.yfz.Lesson/people/10

2)从路径中获取ID: parseId(uri)


Java代码


Uri uri = Uri.parse("content://com.yfz.Lesson/people/10")

long personid = ContentUris.parseId(uri);
复制代码最后personid 为 :10

附上实验的代码:


Java代码


package com.yfz;

import com.yfz.log.Logger;

import android.app.Activity;

import android.content.ContentUris;

import android.content.UriMatcher;

import android.net.Uri;

import android.os.Bundle;

public class Lesson_14 extends Activity {

               

                private static final String AUTHORITY = "com.yfz.Lesson";

                private static final int PEOPLE = 1;

                private static final int PEOPLE_ID = 2;

               

                //NO_MATCH表示不匹配任何路径的返回码

                private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);

                static

            {

                sURIMatcher.addURI(AUTHORITY, "people", PEOPLE);

               

                //这里的#代表匹配任意数字,另外还可以用*来匹配任意文本

                sURIMatcher.addURI(AUTHORITY, "people/#", PEOPLE_ID);

            }

               

                @Override

                protected void onCreate(Bundle savedInstanceState) {

                        super.onCreate(savedInstanceState);

                        Logger.d("------ Start Activity !!! ------");

                        

                        Uri uri1 = Uri.parse("content://" + AUTHORITY + "/people");

                        Logger.e("Uri:" + uri1);

                        Logger.d("Match 1" + getType(uri1));

                        

                        Uri uri2 = Uri.parse("content://" + AUTHORITY + "/people" + "/2");

                        

                        Logger.e("Uri:" + uri2);

                        Logger.d("Match 2" + getType(uri2));

                        

                        //拼接Uri

                        Uri cUri = ContentUris.withAppendedId(uri1, 15);

                        Logger.e("Uri:" + cUri);

                        //获取ID

                        long id = ContentUris.parseId(cUri);

                        Logger.d("Uri ID: " + id);

                }

               

                private String getType(Uri uri) {

                        int match = sURIMatcher.match(uri);

                switch (match)

                {

                    case PEOPLE:

                        return "vnd.android.cursor.dir/person";

                    case PEOPLE_ID:

                        return "vnd.android.cursor.item/person";

                    default:

                        return null;

                }

                }

}
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-11 10:53 , Processed in 0.404206 second(s), 46 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表