Android应用程序组件Content Provider应用实例( 三 )


此外,我们还需要定义与URI对应的资源的MIME类型 。每个MIME类型由两部分组成,前面是数据的大类别,后面定义具体的种类 。在 中,URI所对应的资源的MIME类型的大类别根据同时访问的资源的数量分为两种,对于访问单个资源的URI,它的大类别就为vnd...item,而对于同时访问多个资源的URI,它的大类别就为vnd...dir 。的URI所对应的资源的MIME类型的具体类别就需要由 的提供者来设置了,它的格式一般为vnd.[ name].[ type]的形式 。例如,在我们的例子中,和两个常量分别定义了两种MIME类型,它们的大类别分别为vnd...dir和vnd...item,而具体类别均为vdn.shy.luo.,其中shy.luo就是表示公司名了,而表示资源的类型为文章 。这两个MIME类型常量主要是在实现的函数时用到的,后面我们将会看到 。
最后,ITEM、和三个常量分别定了三个URI匹配规则的匹配码 。如果URI的形式为://shy.luo../item,则匹配规则返回的匹配码为ITEM;如果URI的形式为://shy.luo../item/#,其中#表示任意一个数字,则匹配规则返回的匹配码为;如果URI的形式为#也是表示任意一个数字,则匹配规则返回的匹配码为 。这三个常量的用法我们在后面也将会看到 。
这样,.java文件的内容就介绍完了 。下面我们再接着介绍位于src/shy/luo//目录下的.java文件,它的内容如下所示:
import java.util.HashMap;import android.content.ContentValues;import android.content.Context;import android.content.UriMatcher;import android.content.ContentProvider;import android.content.ContentUris;import android.content.ContentResolver;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteDatabase.CursorFactory;import android.database.sqlite.SQLiteException;import android.database.sqlite.SQLiteOpenHelper;import android.database.sqlite.SQLiteQueryBuilder;import android.net.Uri;import android.os.Bundle;import android.text.TextUtils;import android.util.Log;public class ArticlesProvider extends ContentProvider {private static final String LOG_TAG = "shy.luo.providers.articles.ArticlesProvider";private static final String DB_NAME = "Articles.db";private static final String DB_TABLE = "ArticlesTable";private static final int DB_VERSION = 1;private static final String DB_CREATE = "create table " + DB_TABLE +" (" + Articles.ID + " integer primary key autoincrement, " +Articles.TITLE + " text not null, " +Articles.ABSTRACT + " text not null, " +Articles.URL + " text not null);";private static final UriMatcher uriMatcher;static {uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);uriMatcher.addURI(Articles.AUTHORITY, "item", Articles.ITEM);uriMatcher.addURI(Articles.AUTHORITY, "item/#", Articles.ITEM_ID);uriMatcher.addURI(Articles.AUTHORITY, "pos/#", Articles.ITEM_POS);}private static final HashMap articleProjectionMap;static {articleProjectionMap = new HashMap();articleProjectionMap.put(Articles.ID, Articles.ID);articleProjectionMap.put(Articles.TITLE, Articles.TITLE);articleProjectionMap.put(Articles.ABSTRACT, Articles.ABSTRACT);articleProjectionMap.put(Articles.URL, Articles.URL);}private DBHelper dbHelper = null;private ContentResolver resolver = null;@Overridepublic boolean onCreate() {Context context = getContext();resolver = context.getContentResolver();dbHelper = new DBHelper(context, DB_NAME, null, DB_VERSION);Log.i(LOG_TAG, "Articles Provider Create");return true;}@Overridepublic String getType(Uri uri) {switch (uriMatcher.match(uri)) {case Articles.ITEM:return Articles.CONTENT_TYPE;case Articles.ITEM_ID:case Articles.ITEM_POS:return Articles.CONTENT_ITEM_TYPE;default:throw new IllegalArgumentException("Error Uri: " + uri);}}@Overridepublic Uri insert(Uri uri, ContentValues values) {if(uriMatcher.match(uri) != Articles.ITEM) {throw new IllegalArgumentException("Error Uri: " + uri);}SQLiteDatabase db = dbHelper.getWritableDatabase();long id = db.insert(DB_TABLE, Articles.ID, values);if(id