【Android】进程通信IPC——ContentProvider

简介

内容提供者为应用程序提供内容,它封装数据并通过ContentResolver将其提供给应用程序。只有在多个应用间需要共享数据的时候才需要ContentProvider。Android已经为常见的一些数据提供了默认的ContentProvider。

数据提供者

  1. Provider
    ContentProvider需要在AndroidManifest.xml中声明。

        <provider
            android:name=".module.ContentProvider.CustomContentProvider"
            android:authorities="com.sjl.provider"
            android:enabled="true"
            android:exported="true"
            android:readPermission="com.sjl.provider.read"
            android:writePermission="com.sjl.provider.write"></provider>
    
    说明
    authorities
    ported
    adPermission
    itePermission

    注: ContentProvider的authorities必须是唯一的,两个APP不能声明相同的authorities,否则安装时会报错INSTALL_FAILED_CONFLICTING_PROVIDER

  2. ContentProvider
    继承ContentProvider,实现需要实现的方法(onCreate,getType,insert,delete,update,query)。

        @Override
        public boolean onCreate() {
            mContext = getContext();
            mUserDBHelper = new UserDBHelper(mContext);
            db = mUserDBHelper.getWritableDatabase();
    
            mUriMatcher.addURI(AUTHORITIES, PATH, CODE);
            return true;
        }
    
        @Override
        public int delete(Uri uri, String selection, String[] selectionArgs) {
            if (isMatch(uri)) {
                return db.delete(UserDBHelper.TABLE_USER, selection, selectionArgs);
            }
            return 0;
        }
    
        @Override
        public String getType(Uri uri) {
            // at the given URI.
            return null;
        }
    
        @Override
        public Uri insert(Uri uri, ContentValues values) {
            if (isMatch(uri)) {
                long id = db.insert(UserDBHelper.TABLE_USER, null, values);
                return ContentUris.withAppendedId(uri, id);
            }
            return null;
        }
    
        @Override
        public Cursor query(Uri uri, String[] projection, String selection,
                            String[] selectionArgs, String sortOrder) {
            if (isMatch(uri)) {
                return db.query(UserDBHelper.TABLE_USER, projection, selection, selectionArgs, null, null, sortOrder);
            }
            return null;
        }
    
        @Override
        public int update(Uri uri, ContentValues values, String selection,
                          String[] selectionArgs) {
            if (isMatch(uri)) {
                return db.update(UserDBHelper.TABLE_USER, values, selection, selectionArgs);
            }
            return 0;
        }
        
        /**
         * 是否是提供的数据访问
         * @param uri
         * @return
         */
        private boolean isMatch(Uri uri) {
            return CODE == mUriMatcher.match(uri);
        }
    

内容访问者

使用ContentResolver访问数据库,传入内容提供者的Uri。访问ContentProvider所在程序的时候会启动它的Application。

  1. 权限声明
    根据需要在AndroidManifest.xml加入需要的读写权限。
  2. 数据操作
    使用ContentResolver进行insert,delete,update,query操作
    getContentResolver().insert(uri, contentValues);
    
    getContentResolver().delete(mUri, "name like ?", new String[]{"visitor%"});
    
    getContentResolver().update(mUri, contentValues, "name like ?", new String[]{"visitor%"})
    
    getContentResolver().query(mUri, new String[]{"id", "name", "age", "address"}, null, null, null)
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值