Android之ContentProvider

在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";
}
}








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值