内容提供者

内容提供者

什么是内容提供者

在安卓系统中,各应用之间的数据信息是无法直接传递共享的,因此,系统提供了一个组件,用来把系统私有的数据库暴漏给其他应用使用,这就是内容提供者

内容提供者有什么用

内容提供者可以将私有的数据库暴漏给其他应用使用,这样不仅方便了资源共享,另一方面也保证了私有数据库的安全

内容提供者怎么用

①创建内容提供者 (写一个类继承contentprovider 清单文件声明 实现gettype insert update delete query oncreate 五个方法

<provider
android:name=".MyContentProvider"
android:exported="true" android:enabled="true"
android:authorities="com.itheima.mydataprovider"/>

android:authorities 通过这个字符串匹配唯一的内容提供者 尽量使用公司域名的倒写开头 避免跟其他应用冲突exported一定设置为true

② onCreate中创建一个openHelper对象 通过这个openHelper帮助打开数据库

 public boolean onCreate() {
    // 当内容提供者创建的时候 会走这个方法
    //在这里可以创建openHelper但是不要打开数据库
    openHelper = new MyOpenHelper(getContext());
    return false;
}

③ 创建一个UriMatcher对象 通过这个对象帮助处理uri的路径添加 以及路径的匹配 并且 通过UriMatcher 添加一系列的路径
private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);

private static final int QUERY_MATCHED = 1;

private static final int INSERT_MATCHED = 2;

private static final int UPDATE_MATCHED = 3;

private static final int DELETE_MATCHED = 4;

static {
    //给匹配器添加 匹配规则(添加新的uri路径)
    sURIMatcher.addURI("com.itheima.mydataprovider", "query", QUERY_MATCHED);
    sURIMatcher.addURI("com.itheima.mydataprovider", "insert", INSERT_MATCHED);
    sURIMatcher.addURI("com.itheima.mydataprovider", "update", UPDATE_MATCHED);
    sURIMatcher.addURI("com.itheima.mydataprovider", "delete", DELETE_MATCHED);
    // content://authorities/子路径
    //content://com.itheima.mydataprovider/query
}

④ 实现update insert delete query的方法

先判断uri 再根据uri的匹配结果 操作SQLiteDatabase
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int match = sURIMatcher.match(uri);
if(DELETE_MATCHED == match){
SQLiteDatabase db = openHelper.getReadableDatabase();
int result = db.delete(“info”, selection, selectionArgs);
db.close();
return result;
}else{
return -1;
}
}

@Override
public String getType(Uri uri) {
    // TODO: Implement this to handle requests for the MIME type of the data
    // at the given URI.
    throw new UnsupportedOperationException("Not yet implemented");
}

@Override
public Uri insert(Uri uri, ContentValues values) {
    //先匹配传入的uri
    int result = sURIMatcher.match(uri);
    if(result==INSERT_MATCHED){
        //如果匹配的结果是 insert的话 执行insert的操作 返回结果
        SQLiteDatabase db = openHelper.getReadableDatabase();
        long info = db.insert("info", null, values);
        db.close();
        //当插入一条数据的时候 数据库的内容发生了变化 可以通过内容解析者发出一个通知
        ContentResolver resolver = getContext().getContentResolver();
        //第一个参数 uri 通过这个uri来确定 我要通知那些内容观察者
        //第二个参数  如果传入了一个内容观察者 只有这个内容观察者能够收到消息 可以传null 如果是null
        //只要注册了相同的uri就可以收到数据变化的消息
        resolver.notifyChange(uri,null);
        return Uri.parse(String.valueOf(info));
    }else{
        //结果没有匹配 返回null;
        return null;
    }
}

@Override
public boolean onCreate() {
    // 当内容提供者创建的时候 会走这个方法
    //在这里可以创建openHelper但是不要打开数据库
    openHelper = new MyOpenHelper(getContext());
    return false;
}

@Override
public Cursor query(Uri uri, String[] projection, String selection,
                    String[] selectionArgs, String sortOrder) {
    int result = sURIMatcher.match(uri);
    if(result == QUERY_MATCHED){
        SQLiteDatabase db = openHelper.getReadableDatabase();
        Cursor cursor = db.query("info", projection, selection, selectionArgs, null, null, sortOrder);
        return cursor;
    }else{
        throw new IllegalArgumentException("口令错误");
    }

}

@Override
public int update(Uri uri, ContentValues values, String selection,
                  String[] selectionArgs) {
    if(UPDATE_MATCHED == sURIMatcher.match(uri)){
        SQLiteDatabase db = openHelper.getReadableDatabase();
        int result = db.update("info", values, selection, selectionArgs);
        db.close();
        return result;
    }else{
        return -1;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值