android ContentProvider读取其他应用数据库

来源:互联网 发布:国家顶级域名 中文域名 编辑:程序博客网 时间:2024/06/10 06:20

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();}


0 0