美文网首页
【15】ContentProvider

【15】ContentProvider

作者: 嗟嗟嗟 | 来源:发表于2016-06-17 22:46 被阅读0次

    一、什么是ContentProvider

    内容提供器,顾名思义,就是封装内容提供给程序使用的一个组件,他可以跨应用提供内容。

    二、为什么要使用

    因为ContentProvider有自己的封装方法,所以他比其他数据存储方式的接口和调用方式更加统一,还可以隐藏自己的数据结构,提高安全性。

    三、如何使用系统提供的ContentProvider

    一般通过ContentResolver类来间接调用ContentProvider的方法,不同的资源通过Uri来调用。
    Uri的格式类似HTTP中的URI,一般分为协议头——包名——表名——ID

    以下为查询系统联系人号码程序代码

    ContentResolver resolver = getContentResolver();
    Cursor cr = resolver.query(Contacts.CONTENT_URI,new String[] {Contacts._ID,Contacts.DISPLAY_NAME},null,null,null);
    if(cr!=null){
        while(cr.moveToNext()){
            int id = cr.getInt(cr.getColumnIndex(Contacts._ID));
            String name = cr.getString(cr.getColumnIndex(Contacts.DISPLAY_NAME));
            Log.i("info","id = " + id);
            Log.i("info","name = " + name);
            Cursor cr1 = resolver.query(Phone.CONTENT_URI,new String[] {Phone.NUMBER},Phone.CONTACT_ID+"="+id,null,null);
            if(cr1!=null){
                while(cr1.moveToNext()){
                    String number = cr1.getString(cr1.getColumnIndex(Phone.NUMBER));
                    Log.i("info","number = " + number);
                }
                cr1.close();
            }
        }
        cr.close();
    

    四、如何自定义一个ContentProvider

    • 首先,需要新建一个类继承ContentProvider,实现其方法。
    • 然后,要在Manifasts中注册。

    新建MyContentProvider类

    public class MyContentProvider extends ContentProvider {
    
        private SQLiteOpenHelper helper;
        private SQLiteDatabase db;
        private  static UriMatcher uriMatcher;
        public static final String CONTENT = "content://";
        public static final String AUTHORITY = "com.geekband.contentproviderdemo03";
        public static final String USER_TABLE_NAME = "usertb";
        public static final int USER_URI_CODE = 1;
        public static final String URI = "content://com.geekband.contentproviderdemo03/usertb";
    
    
        static {
            uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
            uriMatcher.addURI(AUTHORITY,USER_TABLE_NAME,USER_URI_CODE);
        }
    
        @Override
        public boolean onCreate() {
            helper = new MySQLiteHelper(getContext(),"user.db",null,1);
            db = helper.getWritableDatabase();
            return false;
        }
    
        @Nullable
        @Override
        public Cursor query(Uri uri, String[] strings, String s, String[] strings1, String s1) {
    
            String tableName = getTableName(uri);
            if(TextUtils.isEmpty(tableName)){
                return null;
    
            }
            Cursor c = db.query(tableName,strings,s,strings1,null,null,s1);
            return c;
    
        }
    
        @Nullable//多个的时候返回IVY,单个的时候返回ITEM
        @Override
        public String getType(Uri uri) {
            return null;
        }
    
        @Nullable
        @Override
        public Uri insert(Uri uri, ContentValues contentValues) {
            String tableName = getTableName(uri);
            if(TextUtils.isEmpty(tableName)){
                return null;
            }
            long id = db.insert(tableName,null,contentValues);
            return ContentUris.withAppendedId(uri, id);
        }
    
        @Override
        public int delete(Uri uri, String s, String[] strings) {
            String tableName = getTableName(uri);
            if(TextUtils.isEmpty(tableName)){
                return 0;
            }
            int count = db.delete(tableName,s,strings);
            return count;
        }
    
        @Override
        public int update(Uri uri, ContentValues contentValues, String s, String[] strings) {
            String tableName = getTableName(uri);
            if(TextUtils.isEmpty(tableName)){
                return 0;
            }
            int count = db.update(tableName,contentValues,s,strings);
            return count;
        }
    
        public String getTableName(Uri uri){
            int type = uriMatcher.match(uri);
            String tableName = null;
            switch (type){
                case USER_URI_CODE:
                    tableName = USER_TABLE_NAME;
                    break;
            }
            return tableName;
        }
    }
    

    注册

    <provider
                android:authorities="com.geekband.contentproviderdemo03"
                android:name=".MyContentProvider"/>
    

    相关文章

      网友评论

          本文标题:【15】ContentProvider

          本文链接:https://www.haomeiwen.com/subject/pxivdttx.html