Android中ContentProvider组件详解

来源:互联网 发布:淘宝药品 编辑:程序博客网 时间:2024/05/17 04:23

Android中ContentProvider组件详解


1. ContentProvider

ContentProvider(内容提供者)是Android的4大组件之一。主要用于对外共享数据,也就是通过ContentProvider把应用中的数据共享给其他应用访问,

其他应用程序通过ContentResolver来对其共享的的数据进行增删改查操作。

ContentProvider分为系统的和自定义的,系统的有例如联系人、相册图片等数据。


Google Doc中对ContentProvider的大概描述如下:

内容提供者将一些特定的应用程序数据提供给其他应用程序使用。内容提供者继承与ContentProvider基类,为其他应用程序取用和存储它管理的数据实现了一套标准方法。

然而,应用程序并不直接调用这些方法,而是使用一个ContentResolver对象,调用它的方法作为替代。ContentResolver可以喝任意内容提供者进行会话,

与其合作来对所有相关交互通讯进行管理。

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"。


2. ContentResolver

当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver类来完成,

要获得ContentResolver对象,可以使用Context提供的getContentResolver()方法。

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。


3. Uri

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


那么下面就来描述一下实现的步骤:

假设有A、B两个应用程序,我想让A共享一些数据出来给B可以使用。

那么A程序

1、实现一个ContentProvider的子类,并重写query,insert,update,delete等这几个方法

2、在androidmanifest.xml中注册ContentProvider,指定的android:authorities属性;

然后B程序就要通过ContentResolver来操作A程序共享出来数据:

1、通过Context的getContentResolver()方法获取ContentResolver对象;

2、通过ContentResolver对象来query、insert、update、delete来进行操作;


在实现query,insert,update,delete时有一个重要的参数Uri类,Uri一个中要的方法Uri.parse(String str)用来解析str字符串,而str字符串格式一般都有A程序提供给B程序,B程序按照指定的格式去请求 。比如:content//:com.android.xiong.ConentProviderTestA.firstContentProvider/xiong 其格式一般分为三个部分:content//:这部分是固定不变的 而com.android.xiong.ConentProviderTestA.firstContentProvider表A程序在androidmanifest.xml注册的android:authorities属性,xiong则表示资源部分。

<span style="font-size:12px;"> <provider             android:name="com.android.xiong.conentprovidertesta.FirstContentProvider"             android:authorities="com.android.xiong.ConentProviderTestA.firstContentProvider"             android:exported="true" >  </provider>  </span>








0 0
原创粉丝点击