• 自定义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即可

  • 相关阅读:
    HTML 块标签的学习(样式/节)
    HTML 链接标签的学习
    HTML 列表标签的学习
    (译)快速指南:用UIViewPropertyAnimator做动画
    RunLoop 总结:RunLoop的应用场景(二)
    RunLoop 总结:RunLoop的应用场景(一)
    Android Studio精彩案例(二)《仿微信动态点击底部tab切换Fragment》
    Android Studio精彩案例(一)《ActionBar和 ViewPager版仿网易新闻客户端》
    Android简易实战教程--第四十五话《几种对话框》
    Android中Sqlite数据库进行增删改查
  • 原文地址:https://www.cnblogs.com/bobodeboke/p/2995102.html
Copyright © 2020-2023  润新知