ContentProvider 学习之01

来源:互联网 发布:美国最新战机知乎 编辑:程序博客网 时间:2024/04/30 10:39

文章摘录:http://whatandroid.blog.51cto.com/2172732/865115

ContentProvider概述:

ContentProvider向我们提供了我们在应用程序之前共享数据的一种机制,而我们知道每一个应用程序都是运行在不同的应用程序的,数据和文件在不同应用程序之间达到数据的共享不是没有可能,而是显得比较复杂,而正好Android中的ContentProvider则达到了这一需求,比如有时候我们需要操作手机里的联系人,手机里的多媒体等一些信息,我们都可以用到这个ContentProvider来达到我们所需。

应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据。虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同,如:采用文件方式对外共享数据,需要进行文件操作读写数据;采用sharedpreferences共享数据,需要使用sharedpreferencesAPI读写数据。而使用ContentProvider共享数据的好处是统一了数据访问方式。

我们以一个网站来形象的描述这个ContentProvider吧,可以这么理解为ContentProvider就是一个网站,它向我们去访问网站这里的数据达到了一种可能,它就是一个向外提供数据的接口。那么既然它是向外提供数据,我们有时候也需要去修改数据,这时我们就可以用到另外一个类来实现这个对数据的修改ContentResolver类,这个类就可以通过URI来操作数据。

实现ContentProvider

1、 编写一个实现ContentProvider的在,这个子类必须要实现一些必须实现的方法,在ContentProvider类里面,有一系列针对于数据的增、删、改、查等方法

2、 ContentProvider也是Android中的四大组件,因此也必须在AndroidMainfest.xml中完成对ContentProvider的注册。

Uri

从Uri谈起

什么是Uri?

Uri是指通用资源标志符

A:前缀表明数据受控于一个内容提供者。它从不修改,也就是schema

B:是指在AndroidMainfest.xml中我们注册的provider中的android:authorities属性所对应的

C:具体操作于哪个条目

D:具体指定到哪个条目下的哪条记录

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

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

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

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

1.scheme:ContentProvider(内容提供者)的scheme已经由Android所规定为:content://。
2.主机名(或Authority):用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。
3.路径(path):可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:
• 要操作contact表中id为10的记录,可以构建这样的路径:/contact/10
• 要操作contact表中id为10的记录的name字段, contact/10/name
• 要操作contact表中的所有记录,可以构建这样的路径:/contact
要操作的数据不一定来自数据库,也可以是文件等他存储方式,如下:
要操作xml文件中contact节点下的name节点,可以构建这样的路径:/contact/name
如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下:
Uri uri = Uri.parse("content://com.changcheng.provider.contactprovider/contact")

因为Uri代表了要操作的数据,所以我们很经常需要解析Uri,并从Uri中获取数据。Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher 和ContentUris 。掌握它们的使用,会便于我们的开发工作。

UriMatcher

初始化:

UriMatcher sMatcher = new UriMatcher(UriMatcher.NO_MATCH);

第二步注册需要的Uri:

sMatcher.addURI("com.test.myprovider", "person", 1);
sMatcher.addURI("com.test.myprovider", "person/#", 2);

第三部,与已经注册的Uri进行匹配:

switch (sMatcher.match(Uri .parse("content://com.test.myprovider/person"))) {
case 1:
System.out.println("1");
break;

case 2:
System.out.println("2");
break;

default:// 不匹配
System.out.println("default");
break;

}

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

总结:
--常量 UriMatcher.NO_MATCH 表示不匹配任何路径的返回码
--# 号为通配符
--* 号为任意字符

ContentUris

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

Uri uri2 = ContentUris.withAppendedId(uri, 10);

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

long id = ContentUris.parseId(uri2);

ContentProvider核心类

常用方法

方法名称

描述

public abstract boolean onCreate ()

在ContentProvider创建后被调用。

public abstract Uri insert (Uri uri, ContentValues values)

根据Uri插入values对就的数据

public abstract int delete (Uri uri, String selection, String[] selectionArgs)

根据Uri删除selection指定的条件所匹配的全部记录

public abstract int update (Uri uri, ContentValues values, String selection, String[] selectionArgs)

根据Uri修改selection指定的条件所匹配的全部记录

public abstract Cursor query (Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)

根据Uri查询出selection指定的条件所匹配的全部记录,并且可以指定查询哪些列(projection),以什么方式(sortOrder)排序

public abstract String getType (Uri uri)

返回当前Uri所数据的MIME类型,如果该Uri对应的数据可能包括多条记录,那么MIME类型字符串就是以vnd.android.cursor.dir/开头,如果Uri对应的数据只包含一条记录,那么MIME类型字符串就是以vnd.android.cursor.item/开头

ContentProvider类是向外提供数据的一种机制,要想来操作这个对外提供的数据,我们就用到了另外一个类:ContentResolver。

ContentResolver

当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver 类来完成,要获取ContentResolver 对象,可以使用Activity提供的getContentResolver()方法。 ContentResolver使用insert、delete、update、query方法,来操作数据。
 这个类里面也定义了一系列的增、删、改、查方法,与其ContentProvider定义的方法基本上相同。

 

 下面是文章摘录出处的一个例子,由于作者的代码给的不是很全,自己整理了一下,这里只给出截图,详细工程会给出链接,自己下载!

完整例子链接:http://download.csdn.net/detail/zhang31jian/4675868