自定义ContentProvider

开发自己的ContentProvider相对来讲比较麻烦,其中一般涉及到数据库、sqlhelper的相关操作。

1,定义数据库的元数据(使用接口),包括数据库名称、版本、AUTHORITY。数据库中各个表的名称,表中各个字段的名称,表的content uri,进行整个表格还是单独一项的操作。

package org.lxh.demo;

import android.net.Uri;
import android.provider.BaseColumns;
public interface MLDNDatabaseMetaData { // MLDN数据库元数据
    // 外部访问的Authroity,Content地址为:content://org.lxh.demo.membercontentprovider
    public static final String AUTHORITY = "org.lxh.demo.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地址,content://org.lxh.demo.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_AGE = "age";
        // 表示member.birthday字段名称
        public static final String MEMBER_BIRTHDAY = "birthday";
        // 显示时的排序字段
        public static final String SORT_ORDER = "_id DESC";
    }
}

2,关于数据库的操作,自然需要借助sqlitehelper

package org.lxh.demo;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class MyDatabaseHelper extends SQLiteOpenHelper {        // 继承SQLiteOpenHelper类
    private static final String DATABASENAME = "mldn.db" ;        // 数据库名称
    private static final int DATABASEVERSION = 1 ;                // 数据库名称
    private static final String TABLENAME = "member" ;            // 数据表名称
    public MyDatabaseHelper(Context context) {
        super(context, DATABASENAME, null, DATABASEVERSION);    // 调用父类构造
    }
    @Override
    public void onCreate(SQLiteDatabase db) {                    // 创建数据表
        String sql = "CREATE TABLE " + TABLENAME + " ("
                + MLDNDatabaseMetaData.MemberTableMetaData._ID
                + "            INTEGER         PRIMARY KEY ,"
                + MLDNDatabaseMetaData.MemberTableMetaData.MEMBER_NAME
                + "    VARCHAR(50)        NOT NULL ,"
                + MLDNDatabaseMetaData.MemberTableMetaData.MEMBER_AGE
                + "        INTEGER            NOT NULL ,"
                + MLDNDatabaseMetaData.MemberTableMetaData.MEMBER_BIRTHDAY
                + "    DATE            NOT NULL)";                 // SQL语句
        db.execSQL(sql) ;                                        // 执行SQL语句
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        String sql = "DROP TABLE IF EXISTS " + TABLENAME ;        // SQL语句
        db.execSQL(sql);                                        // 执行SQL语句
        this.onCreate(db);                                         // 创建表
    }
}


2,定义一个类继承contentprovider.并重写其中的方法,其中需要借助urimatcher,发现其中大部分方法比之于db的CRUD多了个参数uri

package org.lxh.demo;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
public class MemberContentProvider extends ContentProvider {    // 继承ContentProvider
    private static UriMatcher uriMatcher = null;                // 定义UriMatcher对象
    private static final int GET_MEMBER_LIST = 1;                // 查询全部的常量标记
    private static final int GET_MEMBER_ITEM = 2;                // 根据ID查询的常量标记
    private MyDatabaseHelper helper = null;                    // 数据库操作类对象
    static {                                                    // 静态代码块
        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);        // 实例化UriMatcher
        uriMatcher.addURI(MLDNDatabaseMetaData.AUTHORITY, "member",
                GET_MEMBER_LIST);                                // 增加匹配地址
        uriMatcher.addURI(MLDNDatabaseMetaData.AUTHORITY, "member/#",
                GET_MEMBER_ITEM);                                // 增加匹配地址
    }
    @Override
    public boolean onCreate() {
        this.helper = new MyDatabaseHelper(super.getContext()); // 实例化DatabaseHelper
        return false;                                             // 操作成功
    }
    @Override
    public String getType(Uri uri) {                            // 得到MIME
        switch (uriMatcher.match(uri)) {                         // 匹配传入的URI
        case GET_MEMBER_LIST:                                     // 满足条件
            return MLDNDatabaseMetaData.MemberTableMetaData.
                CONTACT_LIST;                                     // 返回所有member信息
        case GET_MEMBER_ITEM: {                                 // 满足条件
            return MLDNDatabaseMetaData.MemberTableMetaData.
                CONTACT_ITEM;                                     // 返回一个member信息
        }
        default:                                                 // 不匹配时返回默认
            throw new UnsupportedOperationException("Not Support Operation:"
                    + uri);                                     // 抛出异常
        }
    }
    @Override
    public Uri insert(Uri uri, ContentValues values) {            // 数据增加
        SQLiteDatabase db = this.helper.getWritableDatabase();     // 取得数据库操作对象
        long id = 0;                                             // 增加之后的id
        switch (uriMatcher.match(uri)) {                         // 匹配传入的UR
        case GET_MEMBER_LIST:                                     // 满足条件
            id = db.insert(MLDNDatabaseMetaData.MemberTableMetaData.TABLE_NAME,
                    MLDNDatabaseMetaData.MemberTableMetaData._ID, 
                    values);                                     // 执行插入
            return ContentUris.withAppendedId(uri, id);         // 返回Uri后面追加ID
        case GET_MEMBER_ITEM:                                     // 满足条件
            id = db.insert(MLDNDatabaseMetaData.MemberTableMetaData.TABLE_NAME,
                    MLDNDatabaseMetaData.MemberTableMetaData._ID, 
                    values);                                     // 执行插入
            String uriPath = uri.toString();                    // 取出地址
            String path = uriPath.substring(0, 
                    uriPath.lastIndexOf("/")) + id;                // 建立新的Uri地址
            return Uri.parse(path);                             // 返回一个member信息
        default:                                                 // 不匹配时返回默认
            throw new UnsupportedOperationException("Not Support Operation:"
                    + uri);                                     // 抛出异常
        }
    }
    @Override
    public int update(Uri uri, ContentValues values, String selection,
            String[] selectionArgs) {                            // 更新操作
        SQLiteDatabase db = this.helper.getWritableDatabase(); // 取得数据库操作对象
        int result = 0;                                         // 操作结果
        switch (uriMatcher.match(uri)) {                         // 匹配传入的URI
        case GET_MEMBER_LIST:                                     // 满足条件
            result = db.update(
                    MLDNDatabaseMetaData.MemberTableMetaData.TABLE_NAME,
                    values, null, null);                         // 更新记录
            break;
        case GET_MEMBER_ITEM:                                     // 满足条件
            long id = ContentUris.parseId(uri);                // 取出传过来的id
            String where = "_id=" + id;                            // 更新条件
            result = db.update(
                    MLDNDatabaseMetaData.MemberTableMetaData.TABLE_NAME,
                    values, where, selectionArgs);                // 执行更新操作
            break;
        default:                                                 // 不匹配时返回默认
            throw new UnsupportedOperationException("Not Support Operation:"
                    + uri);                                     // 抛出异常
        }
        return result;                                            // 返回更新的行数
    }
    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        SQLiteDatabase db = this.helper.getWritableDatabase(); // 取得数据库操作对象
        int result = 0;                                         // 操作结果
        switch (uriMatcher.match(uri)) {                         // 匹配传入的UR
        case GET_MEMBER_LIST:                                     // 满足条件
            result = db.delete(
                    MLDNDatabaseMetaData.MemberTableMetaData.TABLE_NAME,
                    selection, selectionArgs);                    // 删除数据
            break;
        case GET_MEMBER_ITEM:                                     // 满足条件
            long id = ContentUris.parseId(uri);                 // 取得传入的id
            String where = "_id=" + id;                         // 删除语句
            result = db.delete(
                    MLDNDatabaseMetaData.MemberTableMetaData.TABLE_NAME, where,
                    selectionArgs);                                // 删除数据
            break;
        default:                                                 // 不匹配时返回默认
            throw new UnsupportedOperationException("Not Support Operation:"
                    + uri);                                     // 抛出异常
        }
        return result;                                            // 删除的行数
    }
    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder) {        // 查询操作
        SQLiteDatabase db = this.helper.getWritableDatabase(); // 取得数据库操作对象
        switch (uriMatcher.match(uri)) {                         // 匹配传入的UR
        case GET_MEMBER_LIST:                                     // 满足条件
            return db
                    .query(MLDNDatabaseMetaData.MemberTableMetaData.TABLE_NAME,
                            projection, selection, selectionArgs, null, null,
                            sortOrder);                            // 查询
        case GET_MEMBER_ITEM:                                     // 满足条件
            long id = ContentUris.parseId(uri);                // 取出传入ID
            String where = "_id=" + id;                            // 查询条件
            return db.query(
                    MLDNDatabaseMetaData.MemberTableMetaData.TABLE_NAME,
                    projection, where, selectionArgs, null, null, 
                    sortOrder);                                    // 查询操作
        default:                                                 // 不匹配时返回默认
            throw new UnsupportedOperationException("Not Support Operation:"
                    + uri);                                     // 抛出异常
        }
    } 
}

最后一步在配置文件中注册自定义的provider(注意authority需要保持一致)

然后就是在使用自定义provider的时候,借助于contentresolver即可

原文地址:https://www.cnblogs.com/bobodeboke/p/2995102.html