zoukankan      html  css  js  c++  java
  • 自定义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即可

  • 相关阅读:
    003 01 Android 零基础入门 01 Java基础语法 01 Java初识 03 Java程序的执行流程
    002 01 Android 零基础入门 01 Java基础语法 01 Java初识 02 Java简介
    001 01 Android 零基础入门 01 Java基础语法 01 Java初识 01 导学
    001 Android Studio 首次编译执行项目过程中遇到的几个常见问题
    Dora.Interception,为.NET Core度身打造的AOP框架 [2]:以约定的方式定义拦截器
    Dora.Interception,为.NET Core度身打造的AOP框架 [1]:更加简练的编程体验
    监视EntityFramework中的sql流转你需要知道的三种方式Log,SqlServerProfile, EFProfile
    轻量级ORM框架——第二篇:Dapper中的一些复杂操作和inner join应该注意的坑
    轻量级ORM框架——第一篇:Dapper快速学习
    CF888G Xor-MST(异或生成树模板)
  • 原文地址:https://www.cnblogs.com/bobodeboke/p/2995102.html
Copyright © 2011-2022 走看看