Android学习_ContentProvider和Uri

ContentProvider概述

public abstract class

ContentProvider

extends Object

implements ComponentCallbacks2

Content providers are one of the primary building blocks of Android applications, providing content to applications. They encapsulate data and provide it to applications through the single ContentResolver interface. A content provider is only required if you need to share data between multiple applications. For example, the contacts data is used by multiple applications and must be stored in a content provider. If you don’t need to share data amongst multiple applications you can use a database directly via SQLiteDatabase.

When a request is made via a ContentResolver the system inspects the authority of the given URI and passes the request to the content provider registered with the authority. The content provider can interpret the rest of the URI however it wants. The UriMatcher class is helpful for parsing URIs.

Android的ContentProvider作用就是在应用程序之间交换数据,如果我们采用文件共享的方式需要注意的是必须采用特定的数据访问方式,而ContentProvider是不同应用程序之间进行数据交换的标准API。ContentProvider以某种Uri的形式对外提供数据,而其他应用使用ContentResolver根据Uri去访问操作指定数据。

ContentProvider也是Android应用的四大组件之一,与Activity、Service、BroadcastReceiver相似,都需要在AndroidManifest.xml文件中进行配置。

ContentProvider的使用

  • 定义自己的ContentProvider类,继承子ContentProvider基类;
  • 在AndroidManifest.xml文件中注册,并且绑定一个URL。

    public class ImageContentProvider extends ContentProvider{

    //该方法用于供外部应用从ContentProvider删除数据
    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        return 0;
    }
    
    //该方法用于返回当前Url所代表数据的MIME类型
    @Override
    public String getType(Uri uri) {
        return null;
    }
    
    //该方法用于供外部应用往ContentProvider添加数据
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        return null;
    }
    
    //该方法在ContentProvider创建后就会被调用,Android开机后,ContentProvider在其它应用第一次访问它时才会被创建
    @Override
    public boolean onCreate() {
        return false;
    }
    
    //该方法用于供外部应用从ContentProvider中获取数据
    @Override
    public Cursor query(Uri uri, String[] values, String selection, String[] selectionArgs,
        String sortOrder) {
        return null;
    }
    
    //该方法用于供外部应用更新ContentProvider中的数据
    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        return 0;
    }
    

    }

如果操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/开头,

例如:要得到所有person记录的Uri为content://com.ljq.provider.personprovider/person,那么返回的MIME类型字符串应该为:”vnd.android.cursor.dir/person”。

如果要操作的数据属于非集合类型数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头,

例如:得到id为10的person记录,Uri为content://com.ljq.provider.personprovider/person/10,那么返回的MIME类型字符串为:”vnd.android.cursor.item/person”。

注册ContentProvider只需要在

Uri概述

Uri还是很容易理解的,我们可以和互联网的URL进行类比。

content://com.twilight.providers.imagecontentprovider/image/2

这里的意思就是访问image数据总ID为2的记录。虽然大部分ContentProvider操作的数据都是来自于数据库,但是有时候可以来自于文件、XML或网络等其他的存储方式。

content://com.twilight.providers.imagecontentprovider/image/detail

这里的意思就是操作image节点下的detail节点。

Uri工具类

Android系统提供了2个操作Uri的工具类,分别是UriMatcher和ContentUris。

(1)UriMatcher类是用来匹配Uri

UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
matcher.addURI("com.twilight.providers.imageprovider", "image", 1);
matcher.addURI("com.twilight.providers.imageprovider", "image/#", 2);
switch (matcher.match(Uri.parse("content://com.twilight.providers.imageprovider/image/7"))) {
    case 1:
        break;
    case 2:
        break;
    default:
        break;
}

注册完需要匹配的Uri后,是用matcher.match(uri)方法对输入的Uri进行匹配,如果匹配就返回匹配码。

(2)ConentUris类用于操作Uri路径后面的ID部分。

Uri uri1 = Uri.parse("content://com.twilight.providers.imageprovider/image");
Uri resultUri = ContentUris.withAppendedId(uri1, 7);
Uri uri2 = Uri.parse("content://com.twilight.providers.imageprovider/image/7");
long resultId = ContentUris.parseId(uri2);

使用ContentResolver操作数据

ContentProvider相当于一个网站,而ContentResolver则相对于HttpClient。一般来说Content是单例模式,当多个应用程序通过ContentResolver来操作ContentProvider提供的数据时,数据操作会委托给同一个ContentProvider处理。

(1)调用Activity的ContentResolver()获取ContentResolver对象;

(2)使用ContentResolover的insert、delete、update、query方法操作数据,如果是系统提供的ContentProvider,只需要知道ContentProvider的Uri即可。

ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://com.twilight.providers.imageprovider/image");
ContentValues values = new ContentValues();
values.put("name", "pic1");
values.put("date", "2014-03-10");
resolver.insert(uri, values);

监听ContentProvider的数据改变

getContext().getContentResolver().notifyChange(uri, null);

当ContentProvider所共享的数据发生了改变,这行代码可以通知所有注册在改Uri上的监听者,为了在应用程序中监听ContentProvider数据的改变,需要利用Android提供了ContentObserver基类。

监听ContentProvider数据改变的监听器需要继承ContentObserver类,并重写改基类所定义的onChange(boolean selfChange)方法。在使用的时候需要通过ContentProvider向指定的Uri注册ContentObserver监听器。

        final class ImageObserver extends ContentObserver {

            public ImageObserver(Handler handler) {
                super(handler);
            }

            public void onChange(boolean selfChange) {
            }
        }

        getContentResolver().registerContentObserver(Uri.parse("content://com.twilight.providers.imageprovider/image"),
        true, new ImageObserver(new Handler()));

时间: 2024-08-30 07:31:26

Android学习_ContentProvider和Uri的相关文章

Android学习_ContentProvider

创建一个ContentProvider ContentProvider是一个统一发布数据的接口,所有程序可以使用ContentResolver来接收数据 1.创建一个ContentProvider需要扩展自抽象类 public class MyContentProvider extends ContentProvider 2.在Mainifest文件中注册,并设定一个 android:authorities="包名地址": 3.发布ContentProvider的URI地址 publi

Android学习笔记——文件路径(/mnt/sdcard/...)、Uri(content://media/external/...)学习

一.URI 通用资源标志符(Universal Resource Identifier, 简称"URI"). Uri代表要操作的数据,Android上可用的每种资源 - 图像.视频片段等都可以用Uri来表示. URI一般由三部分组成: 访问资源的命名机制. 存放资源的主机名. 资源自身的名称,由路径表示. Android的Uri由以下三部分组成: "content://".数据的路径.标示ID(可选) 举些例子,如: 所有联系人的Uri: content://con

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

一.UriMatcher与ContentUris工具类 UriMatcher 1.功能概述 开发ContentProvider时所实现的query().insert().delete().update()方法的第一个参数为Uri参数,该参数由ContentResolver调用这些方法时传入.在上一篇博文中的实例,并没有真正对数据进行操作,因此ContentProvider并未对Uri参数进行任何判断.所以为了确定该ContentProvider实际能处理的Uri,以确定每个方法中Uri参数所操作

Pro Android学习笔记(三三):Menu(4):Alternative菜单

什么是Alternative menu(替代菜单) 举个例子,Activity显示一个文本文件.如果用户想对文本文件进行编辑,Activity不提供编辑能力,但可由其他activity或者其他应用提供.我们将相关信息存储在一个intent中,例如该文本的Uri.这个intent可以匹配系统的多个应用,替代菜单将这些应用一一列出,菜单项的title就是该可被调用的activity的名字,图标也为该可被调用的activity的图表. 小例子说明 我们通过一个小例子进行学习,简单地打开一个URL:we

(转)Android学习-使用Async-Http实现图片压缩并上传功能

(转)Android学习-使用Async-Http实现图片压缩并上传功能 文章转载自:作者:RyaneLee链接:http://www.jianshu.com/p/940fc7ba39e1 让我头疼一个星期的图片批量上传服务器的问题最后受这篇文章的作者启发而解决,自己之前一直执着于通过uri地址找到图片然后上传图片,却没想过直接上传图片本身.感谢作者的博客和启发. 前言 (转载请注明出处,谢谢!) 最近在做一个小项目,项目中要实现上传图片到服务器,而这个例子是实现图片的尺寸压缩,将获取到的压缩图

udacity android 学习笔记: lesson 4 part b

udacity android 学习笔记: lesson 4 part b 作者:干货店打杂的 /titer1 /Archimedes 出处:https://code.csdn.net/titer1 联系:1307316一九六八 声明:本文採用下面协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 ,转载请注明作者及出处. tips:https://code.csdn.net/titer1/pat_aha/blob/master/Mar

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属性,因此可以满

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

Android引入了Intent的概念来唤起components,component包括:1.Activity(UI元件) 2.Service(后台代码) 3.Broadcast receiver(处理广播消息的代码) 4.Content provider(抽象数据的代码) Intent基本含义 intent是通知平台处理(唤起)的动作.Android唤起的动作将取决于注册了什么动作.例如我们有个简单的Activity:IntentBaiscViewActivity.在AndroidManife

Android学习笔记(四七):Content Provider初谈和Android联系人信息

Content Provider 在数据处理中,Android通常使用Content Provider的方式.Content Provider使用Uri实例作为句柄的数据封装的,很方便地访问地进行数据的增.删.改.查的操作.Android并不提供所有应用共享的数据存储,采用content Provider,提供简单便捷的接口来保持和获取数据,也可以实现跨应用的数据访问.简单地说,Android通过content Provider从数据的封装中获取信息. Content provider使用Uri