android Content Provider介绍

时间:2021-12-13 11:39:31

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

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

1.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”。

2.ContentResolver

当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver类来完成,要获取ContentResolver对象,可以使用Context提供的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"。

第三部分是路径名,用来表示将要操作的数据。可以看作网址中细分的内容路径。

常用的系统URI

访问系统提供的其他数据方法基本类似,只是传入的URI有所区别,这些URI都是API里面提供的,通过系统规定的不同URI可访问系统不同的数据。系统常用的URI如下:

联系人的URI:

ContactsContract.Contacts.CONTENT_URI 管理联系人的Uri

ContactsContract.CommonDataKinds.Phone.CONTENT_URI 管理联系人的电话的Uri

ContactsContract.CommonDataKinds.Email.CONTENT_URI 管理联系人的Email的Uri

(注:Contacts有两个表,分别是rawContact和Data,rawContact记录了用户的id和name,

其中id栏名称 为:ContactsContract.Contacts._ID,name名称栏为ContactContract.Contracts.DISPLAY_NAME,

电话信息表的外键id为 ContactsContract.CommonDataKinds.Phone.CONTACT_ID,

电话号码栏名称为:ContactsContract.CommonDataKinds.Phone.NUMBER。

data表中Email地址栏名称为:ContactsContract.CommonDataKinds.Email.DATA

其外键栏为:ContactsContract.CommonDataKinds.Email.CONTACT_ID)

多媒体的ContentProvider的Uri如下:

MediaStore.Audio.Media.EXTERNAL_CONTENT_URI  存储在sd卡上的音频文件

MediaStore.Audio.Media.INTERNAL_CONTENT_URI  存储在手机内部存储器上的音频文件

MediaStore.Audio.Images.EXTERNAL_CONTENT_URI SD卡上的图片文件内容

MediaStore.Audio.Images.INTERNAL_CONTENT_URI 手机内部存储器上的图片

MediaStore.Audio.Video.EXTERNAL_CONTENT_URI SD卡上的视频

MediaStore.Audio.Video.INTERNAL_CONTENT_URI  手机内部存储器上的视频

(注:图片的显示名栏:Media.DISPLAY_NAME,图片的详细描述栏为:Media.DESCRIPTION  图片的保存位置:Media.DATA

短信URI:Content://sms

发送箱中的短信URI:Content://sms/outbox