Android组件之ContentProvider(内容提供者)

原创 2015年11月19日 20:29:22

1,ContentProvider(内容提供者)是Android中的四大组件之一。主要用于对外共享数据,也就是通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider对指定应用中的数据进行操作。ContentProvider分为系统的和自定义的,系统的也就是例如联系人,图片等数据。

2,以下这段是Google Doc中对ContentProvider的大致概述。
内容提供者将一些特定的应用程序数据供给其它应用程序使用。数据可以存储于文件系统、SQLite数据库或其它方式。内容提供者继承于ContentProvider 基类,为其它应用程序取用和存储它管理的数据实现了一套标准方法。然而,应用程序并不直接调用这些方法,而是使用一个 ContentResolver 对象,调用它的方法作为替代。ContentResolver可以与任意内容提供者进行会话,与其合作来对所有相关交互通讯进行管理。

3,关于数据共享,在文件操作模式,通过指定文件的操作模式为Context.MODE_WORLD_READABLE或Context.MODE_WORLD_WRITEABLE同样也可以对外共享数据。那么,这里为何要使用ContentProvider对外共享数据呢?答案是:如采用文件操作模式对外共享数据,数据的访问方式会因数据存储的方式而不同,导致数据的访问方式无法统一,如:采用sharedpreferences共享数据,需要使用sharedpreferences API读取数据;采用xml文件对外共享数据,需要进行xml解析才能读取数据。使用ContentProvider对外共享数据的好处是统一了数据的访问方式。

4.ContentProvider
Android提供了一些主要数据类型的ContentProvider,比如音频、视频、图片和私人通讯录等。可在android.provider包下面找到一些Android提供的ContentProvider。通过获得这些ContentProvider可以查询它们包含的数据,当然前提是已获得适当的读取权限。
主要方法:
public boolean onCreate() 在创建ContentProvider时调用
public Cursor query(Uri, String[], String, String[], String) 用于查询指定Uri的ContentProvider,返回一个Cursor
public Uri insert(Uri, ContentValues) 用于添加数据到指定Uri的ContentProvider中
public int update(Uri, ContentValues, String, String[]) 用于更新指定Uri的ContentProvider中的数据
public int delete(Uri, String, String[]) 用于从指定Uri的ContentProvider中删除数据
public String getType(Uri) 用于返回指定的Uri中的数据的MIME类型
*如果操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/开头。
例如:要得到所有person记录的Uri为content://contacts/person,那么返回的MIME类型字符串为"vnd.android.cursor.dir/person"。
*如果要操作的数据属于非集合类型数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头。
例如:要得到id为10的person记录的Uri为content://contacts/person/10,那么返回的MIME类型字符串应为"vnd.android.cursor.item/person"。

5.ContentResolver
当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver类来完成,要获取ContentResolver对象,可以使用Context提供的getContentResolver()方法。

  1. ContentResolver cr = getContentResolver();  

ContentResolver提供的方法和ContentProvider提供的方法对应的有以下几个方法。
public Uri insert(Uri uri, ContentValues values) 用于添加数据到指定Uri的ContentProvider中。
public int delete(Uri uri, String selection, String[] selectionArgs) 用于从指定Uri的ContentProvider中删除数据。
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) 用于更新指定Uri的ContentProvider中的数据。
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) 用于查询指定Uri的ContentProvider。

6.Uri
Uri指定了将要操作的ContentProvider,其实可以把一个Uri看作是一个网址,我们把Uri分为三部分。
第一部分是"content://"。可以看作是网址中的"http://"。
第二部分是主机名或authority,用于唯一标识这个ContentProvider,外部应用需要根据这个标识来找到它。可以看作是网址中的主机名,比如"blog.csdn.net"。
第三部分是路径名,用来表示将要操作的数据。可以看作网址中细分的内容路径。

7,需要在AndroidManifest.xml使用对该ContentProvider进行配置,为了能让其他应用找到该ContentProvider ,ContentProvider采用了authorities(主机名/域名)对它进行唯一标识,你可以把ContentProvider看作是一个网站(想想,网站也是提供数据者),authorities 就是他的域名:

<provider android:name="com.example.testcp.FirstContentProvider"android:authorities="com.example.testcp.FirstContentProvider">

 </provider>

8,UriMatcher和ContentUris类使用介绍

在Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher和ContentUris 。UriMatcher类用于匹配Uri,它的用法如下:

首先第一步把你需要匹配Uri路径全部给注册上,如下:

<span style="font-size:18px;">public static finalUriMatcher uriMatcher;
publicstaticfinal int INCOMING_USER_COLLECTION = 1;
publicstaticfinal int INCOMING_USER_SINGLE = 2;
privateDatabaseHelper dh;
static{
    //常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码
    uriMatcher = newUriMatcher(UriMatcher.NO_MATCH);
    uriMatcher.addURI(FirstProviderMetaData.AUTHORIY,"/users", INCOMING_USER_COLLECTION);
    uriMatcher.addURI(FirstProviderMetaData.AUTHORIY,"/users/#", INCOMING_USER_SINGLE);
//#号为通配符
}
 
    switch(uriMatcher.match(uri)){
        caseINCOMING_USER_COLLECTION:
             returnUserTableMetaData.CONTENT_TYPE;
        caseINCOMING_USER_SINGLE:
             returnUserTableMetaData.CONTENT_TYPE_ITEM;
        default:
             thrownewIllegalArgumentException("Unknown URI" + uri);
  
  }

ContentUris类使用介绍:
ContentUris类用于操作Uri路径后面的ID部分,它有两个比较实用的方法:
1)withAppendedId(uri, id)用于为路径加上ID部分:

//生成后的Uri为:content://com.example.testcp.FirstContentProvider/users/1
Uri uri = Uri.parse("content://com.example.testcp.FirstContentProvider/users")
Uri insertedUserUri = ContentUris.withAppendedId(uri, 1);
2)parseId(uri)方法用于从路径中获取ID部分:

//获取的结果为:1
Uri insertedUserUri = Uri.parse("content://com.example.testcp.FirstContentProvider/users/1")
longuserId = ContentUris.parseId(insertedUserUri);
</span>




版权声明:本文为博主原创文章,未经博主允许不得转载。

Android四大组件之内容提供者--ContentProvider

1,什么是ContentProvider 2,怎么创建 3,在手机上注册 4,其它应用怎么访问 5,Uri的处理 URI代表要操作的数据,由scheme、authorites、path三部分组成 ...
  • A__17
  • A__17
  • 2015年06月28日 12:31
  • 1627

Android 四大组件之一 :ContentProvider内容提供者从入门到精通

转自: http://www.jianshu.com/p/f5ec75a9cfea前言ContentProvider虽然与Activity、Service、BroadcastReceiver齐名为A...

浅析Android四大组件之一:ContentProvider 内容提供者 源码

今天在写代码的时候,发现我们用下面的这行代码就能够调用ContentProvider下面的insert方法,Uri uri=getContentResolver().insert(MyContentP...

Android组件系列----ContentProvider内容提供者【4】

(4)单元测试类: 这里需要涉及到另外一个知识:ContentResolver内容访问者。 要想访问ContentProvider,则必须使用ContentResolver。可以通过Con...

Android组件系列----ContentProvider内容提供者【3】

(3)【核心】新建类PersonContentProvider,继承ContetProvider PersonContentProvider.java: 1 package com...

Android四大组件之一ContentProvider内容提供者(继SQLite数据存储篇)

ContentProvider内容提供者 ContentProvider(内容提供者)是用来共享应用程序内的数据; 当我们需要把应用程序的数据共享给其他的应用程序的时候用它; 该组件对...

Android组件系列----ContentProvider内容提供者【1】

【正文】 一、ContentProvider简介: ContentProvider内容提供者(四大组件之一)主要用于在不同的应用程序之间实现数据共享的功能。 ContentPro...

android ContentProvider内容提供者

  • 2017年11月29日 11:53
  • 34.18MB
  • 下载

2016-05-11安卓四大组件 内容提供者contentprovider +数据库+解析者

MainActivity:package com.guyulei.contentprovider;import android.app.Activity; import android.os.Bund...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android组件之ContentProvider(内容提供者)
举报原因:
原因补充:

(最多只允许输入30个字)