android ContentProvider读取其他应用数据库

android中,保存和读取数据数据的方式很多种,大致上有网络保存,内存记忆,文件保存和数据库保存。

而应用之间的数据库数据分享,读写,主要用到的便是ContentProvider.


为什么这么说呢? 如果能直接读取数据库文件的话会快很多,然而我们并没有直接读写数据库文件即****.db的权限,即便实在cmd命令下ls目录,也会直接提示

permission denied.

因为我们只能通过ContentProvider了。简单的分析下,使用的步骤大概分为下面几步:

1)获取得到需要读写数据库文件应用的相关信息:

信息需要有:1.数据库文件名字 2.数据库表名字 3.配置文件中是否暴露出authorities.4.是否exported为true


2)ContentResolver 和UriMatcher、Uri

ContentResolver 这类主要为了得到cursor,如此就可以得到我们想要得到的数据

UriMatcher主要是根据我们传递过去的uri来处理事物逻辑,比如根据uri来区分后续查询的不同的表、数据库文件等

Uri是为了拼接我们的请求类型 如Uri uri=Uri.parse("content://" + URI + "/" + requestType)

如此,就可以

 //执行query方法返回一个结果集
        Cursor cursor = cr.query(uri, null, null, null, null);

当然可以在方法之中添加自己索要筛选的条件。


当然,出错的地方还是会有的。比如cursor为空的情况,主要可能出自1.数据库名不对、2.配置文件与自己写的不符合等


下面来贴一下大致上的代码:

1.androidMainfest.xml

<provider
    android:name="com.**********"
    android:authorities="com.********
    android:exported="true"
    android:multiprocess="false" />
2.java

//取得ContentResolver对象
ContentResolver cr = getContentResolver();
//指定uri并指定操作哪个表
Uri uri = Uri.parse("content://" + URI + "/" + requestType);
//执行query方法返回一个结果集
Cursor cursor = cr.query(uri, null, null, null, null);
//遍历结果集,取出数据
ArrayList<VodRecord> mVodRecordList = null;
if (cursor != null && cursor.getCount() > 0) {
    mVodRecordList = new ArrayList<>();
    cursor.moveToFirst();
    for (int i = 0; i < cursor.getCount(); i++) {
        VodRecord record;
        if (isTopic) {
            record = RecordDataUtils.getTopicRecord(cursor);
        } else {
            record = RecordDataUtils.getVodRecord(cursor);
        }
        mVodRecordList.add(record);
        cursor.moveToNext();
    }
    cursor.close();
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值