android四大组件之ContentProvider

时间:2021-04-28 22:42:50

ContentProvider也是android的四大组件之一,与Activity、Service一样,使用ContentProvider也需要在AndroidManifest.xml文件中进行配置。

       java.lang.Object
         |-- android.content.ContentProvider

       同样类似于Activity、Service,ContentProvider也一样实现了ComponentCallbacks接口。

       android平台提供了4种数据持久化方案,分别是文件、Preference、数据库(SQLite)和ContentProvider。那么ContentProvider作为android四大组件之一与其它三种有什么不同呢——ContentProvider存储的数据允许应用程序之间共享。在android系统中,已经预置了几种ContentProvider,向开发者提供音频、视频、图片、联系人和呼叫记录等数据。很明显,如果这些数据使用数据库接口来存储,那么将无法提供给其它的应用程序使用。当然,如果数据只是想在应用程序内部使用,就不应该使用ContentProvider,而使用数据库或文件等可以获得更高效的读写操作。

       一旦某个程序通过ContentProvider暴露了自己的数据操作接口,那么不管该应用程序是否启动,其它应用程序都可以通过接口来操作该程序的内部数据,包括增加数据、删除数据、修改数据和查询数据等。ContentProvider是不同应用程序之间进行数据交换的标准API,ContentProvider以某种Uri的形式对外提供数据,允许其它应用程序访问或修改数据,其它应用程序根据Uri去访问操作指定数据。

 

       既然有了ContentProvider,那么我们如何访问ContentProvider所提供的数据呢?android为开发者提供了ContentResolver来操作数据。

       Context提供了如下方法来获取ContentResolver对象:getContentResolver(),一旦程序获得ContentResolver对象之后,就可以调用ContentResolver的如下方法来操作数据:

insert(Uri uri,ContentValues values):向Uri对应的ContentProvider中插入values对应的数据
delete(Uri uri,String where,String[] selectionArgs):删除Uri对应的ContentProvider中where提交匹配的数据
update(Uri uri,ContentValues values,String where,String[] selectionArgs):更新Uri对应的ContentProvider中where提交匹配的数据
query(Uri uri,String projection,String selection,String[] selectionArgs,String sortOrder):查询Uri对应的ContentProvider中where提交匹配的数据
       一般来说,ContentProvider是单实例模式的,当多个应用程序通过ContentResolver来操作ContentProvider提供的数据时,ContentProvider调用的数据操作会委托给一个ContentProvider处理。

       如果想使用ContentResolver处理系统预置的ContentProvider,那么由以上的函数参数得知,我们有必要了解下android系统提供的各类ContentProvider的Uri:

android对联系人管理ContentProvider的几个Uri:

ContactsContract.Contacts.CONTENT_URI:管理联系人的Uri
 ContactsContract.CommonDataKinds.Phone.CONTENT_URI:管理联系人的电话的Uri
 ContactsContract.CommonDataKinds.Email.CONTENT_URI:管理联系人的邮件的Uri

android对多媒体管理ContentProvider的几个Uri:

MediaStore.Audio.Media.EXTERNAL_CONTENT_URI:存储在外部存储器(SD卡)上的音频文件内容的ContentProvider的Uri
MediaStore.Audio.Media.INTERNAL_CONTENT_URI:存储在手机内部存储器上的音频文件内容的ContentProvider的Uri
MediaStore.Images.Media.EXTERNAL_CONTENT_URI:存储在外部存储器(SD卡)上的图片文件内容的ContentProvider的Uri
MediaStore.Images.Media.INTERNAL_CONTENT_URI:存储在手机内部存储器上的图片文件内容的ContentProvider的Uri
MediaStore.Video.Media.EXTERNAL_CONTENT_URI:存储在外部存储器(SD卡)上的视频文件内容的ContentProvider的Uri
MediaStore.Video.Media.INTERNAL_CONTENT_URI:存储在手机内部存储器上的视频件内容的ContentProvider的Uri
 下面,我们通过一个读取系统的多媒体存储信息的例子来演示如何使用系统提供的ContentProvider:

package nku.jerry.crazyit.crazyit_23; 

import android.os.Bundle;
import android.provider.MediaStore;
import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.view.Menu;
import android.widget.SimpleAdapter;
import android.widget.SimpleCursorAdapter;

public class MainActivity extends Activity
{
//记录查询到的数据
private Cursor cursor;

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获得ContentResolver实例
ContentResolver resolver=getContentResolver();
//从ContentProvider中获得SD卡上的音乐列表
cursor=resolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,null,null,null,
MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
String[] cols=new String[]{MediaStore.Audio.Media.TITLE,MediaStore.Audio.Media.ARTIST};
int[] ids=new int[]{R.id.track_name,R.id.artist};
if(cursor!=null)
{
//添加代码
}
SimpleCursorAdapter adapter=new SimpleCursorAdapter(this,R.layout.song_list,cursor,cols,ids);
//添加代码
}

}