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