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";
}
}
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";
}
}
相关文章推荐
- Prepare for Android
- Android 之 语言 国际化
- Android开发第一讲之目录结构和程序的执行流程
- Android实战技巧之七:按钮控制ViewPager的左右翻页
- Android自定义标题栏
- android webview 中 js 模板引擎的使用
- PullToRefreshListView实现根据拖拉的方向进行在顶部或者底部加载数据。
- android:windowSoftInputMode属性详解
- unable to start activity componentinfo,android.view.InflateException
- Android Socket 开发
- Android-Looper类介绍
- android下Rotate旋转动画实现效果
- android实现translate位移动画效果
- android实现scale伸缩动画效果
- Android 开发Project中各个目录和文件的介绍
- Android基础课程-创建第一个应用
- android实现alpha渐变动画效果
- 基础总结篇之二:Activity的四种launchMode
- android ImageView 详解------API介绍(一)
- Android RadioGroup 换行, 支持多行多列