您的位置:首页 > 移动开发 > Android开发

Android之ContentProvider

2014-03-08 21:13 253 查看
在Android中,用户需要可以在不同的应用程序之间交换数据,为了解决这个问题,Android中提供了一个ContentProvider类,此类的主要功能是把不同应用程序的数据操作标准统一起来,一个应用程序就可以按照ContentProvider类的标准将数据共享给外部。

ContentProvider的主要功能是实现应用程序间的数据交换,这一实现类似于WebService技术,但比WebService更容易理解。

android.content ,ContentProvider类主要是制定数据的操作标准,而这些操作标准都是ContentProvider类中明确地通过方法进行定义。

public abstract boolean onCreate() //当启动组件时调用

public abstract int delete(Uri uri,String selection,String[] selectionArgs) //根据指定的Uri 删除数据,并返回删除数据的行数

public final Context getContext() 返回Context对象

public abstract String getType(Uri uri) //根据指定的Uri,返回操作的MIME类型

public abstract Uri insert(Uri uri,ContentValues values) //根据指定的Uri进行增加数据的操作,并且返回增加后的Uri,在此Uri中会附带有新数据的_id

public abstract Cursor query(Uri uri,String[] projection, String selection, String[] selectinArgs, String sortOrder) //根据指定的Uri执行查询操作,所有的查询结果通过Cursor对象返回

Uri由3部分组成,介绍如下:

(1)A部分(协议)

ContentProvider(内容提供者)访问协议,已经由Android规定为content://

(2)B部分为(主机名或Authority)

用于唯一标示ContentProvider,外部调用者可以根据此标示来找到它,一般都为程序的“包类“名称,但是采用小写字母表示。

(3)C部分(Path)

访问的路径,一般为要操作的数据表的名称。

访问member表的全部数据

content://com.package.memberclass/member/

根据ID访问数据

content://com.package.memberclass/member/3

访问某一条记录的某个字段

content://com.package.memberclass/member/3/name

Uri最常用的功能有两种:查询全部数据和按ID查询

由于所有的地址都是以字符串的形式出现的,所以在Android中,进行ContentProvider调用时都需要依靠android.net.Uri类对字符串的地址进行封装后才可以访问,此类所提供的常用操作方法如下

public static String encode(String s) //对字符串进行编码

public static String decode(String s) //解码

public static Uri fromFile(File file) //从指定的文件之中读取Uri

public static Uri withAppendedPath(Uri baseUri,String pathSegment) //在已有地址之后添加数据

public static Uri parse(String uriString) //将给出的字符串地址变为Uri对象

ContentProvider提供的是一个操作标准,如果要依靠此标准进行数据的操作,必须还要使用android.content.ContentResolver类完成,而该类给出的方法跟ContentProvider相对应,当用户调用ContentResolver类的方法时,实际上就相当于调用了ContentProvider类中的对应方法

public final int delete(Uri url , String where , String[] selectionArgs) //调用ContentProvider对象中的delete()方法

public final String getType(Uri url) //调用ContentProvider对象中的getType方法

public final Uri insert(Uri url , ContentValues values) //调用ContentProvider对象中的insert()方法

public final Cursor query(Uri uri,String[] projection, String selection , String[] selectionArgs , String sortOrder) //调用ContentProvider对象中的query()方法

public final int update(Uri uri , ContentValues values, String where ,String[] selectionArgs) //调用指定Contentprovider对象中的update方法

ContentResolver是一个抽象类,所以要想取得ContentResolver类的实例化对象进行操作,需要依靠public ContentResolver getContentResolver()取得Contentresolver类的对象。

Uri的辅助操作类:ContentUris类和UriMatcher类

为了帮助用户理解ContentResolver、ContentProvider、Uri、ContentUris和UriMatcher等类的作用,下面将手工实现一个ContentProvider的程序。

ContentProvider程序实现清单

MLDNDatabaseMetaData接口,要操作的数据库的元数据接口,定义了一些基本的信息,如数据库的名称、版本等

MLDNDatabaseMetaData.MemberTableMetaData接口,定义了mldn.member表的元数据,如表的字段、表名称等

MyDatabaseHelper 类,SQLite数据库的操作类,用于创建和删除member表

MemberContentProvider类,Member表的ContentProvider的具体实现类

main.xml配置,调用ContentProvider的Activity布局文件

member.xml配置,列表显示member表数据时用到的模板

package com.example.my_contentprovider;

import android.net.Uri;

import android.provider.BaseColumns;

public interface MLDNDatabaseMetaData {

//外部访问的Authroity,Content地址为content://com.example.my_contentprovider.membercontentprovider

public static final String AUTHORITY="com.example.my_contentprovider.membercontentprovider";

//数据库名称为mldn

public static final String DATABASE_NAME="mldn.db";

//数据库版本

public static final int VERSION=1;

//表示member表的元数据定义,直接继承_ID和_COUNT静态常量

public static interface MemberTableMetaData extends BaseColumns{

//数据表的名称

public static final String TABLE_NAME="member";

//外部访问URI地址,com.example.my_contentprovider.membercontentprovider/member

public static final Uri CONTENT_URI=Uri.parse("content://"+AUTHORITY+"/"+TABLE_NAME);

//取得member表中的所有数据

public static final String CONTACT_LIST="vnd.android.cursor.dir/vnd.mldncontentprovider.member";

//取得一个member信息,相当于按照ID查询

public static final String CONTACT_ITEM="vnd.android.cursor.item/vnd.mldncontentprovider.member";

//表示member.name字段名称

public static final String MEMBER_NAME="name";

//表示member.age字段名称

public static final String MEMBER_BIRTHDAY="birthday";

//显示时的排序字段

public static final String SORT_ORDER="_id DESC";

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: