ContentProvider主要应用于进程间数据共享. 对于应用而言, 多进程并不会经常使用, 因而较少使用ContentProvider, 是最不常见的四大组件(Activity, Service, BroadcastReceiver, ContentProvider). 但是其优异的性能与便捷, 对于多应用共享数据而言, 非常重要, 比如共享同一份计步数据等. 开发者只有掌握多种技能, 才能在开发中游刃有余, 用最优的方式完成项目, 提升应用性能, 间接提高用户体验. 本文借用Demo, 讲解ContentProvider共享数据的要点.
更多: http://www.wangchenlong.org/
欢迎Follow我的GitHub: https://github.com/SpikeKing
本文源码的GitHub下载地址
SQLite
ContentProvider需要媒介进行数据存储, 最常用的就是SQLite数据库.
SQLite数据库继承SQLiteOpenHelper
类, 提供数据库名称, 表名, 版本. 在onCreate方法中, 创建数据库表, 添加字段.
本示例使用两张表, 书籍和用户.
1 | public class DbOpenHelper extends SQLiteOpenHelper { |
直接使用数据库的情况较少, 也比较复杂, 推荐使用一些经典ORM数据库, 如Sugar等, 简化管理. ORM, 即对象关系映射.
ContentProvider
ContentProvider提供数据访问的接口, CRUD增删改查. 在onCreate中, 初始化数据库, 并添加数据.
1 | public boolean onCreate() { |
CRUD的参数是Uri, 数据库需要使用表名, 为了便于从Uri映射到表名, 使用关系转换.
1 | private String getTableName(Uri uri) { |
添加数据insert
, 可以注册内容改变的监听, 插入数据时, 广播更新, 即notifyChange
.
1 | public Uri insert(Uri uri, ContentValues values) { |
删除数据delete
, 返回删除数据的数量, 大于0即删除成功.
1 | public int delete(Uri uri, String selection, String[] selectionArgs) { |
修改数据update
, 与删除类似, 返回修改数据的数量.
1 |
|
查询数据query
, 返回数据库的游标, 处理数据.
1 |
|
注意Uri和表名的转换可能为空, 使用
TextUtils.isEmpty
判空.
共享数据
使用ContentProvider的独立进程, 模拟进程间共享数据.
1 | <provider |
在AndroidManifest中, 把Provider注册在
:provider
进程中, 与主进程分离.
添加数据, 通过Uri找到ContentProvider, 使用ContentResolver
的insert
方法, 添加ContentValues
数据.
1 | public void addBooks(View view) { |
查询数据query
, 与数据库的使用方式类似, 解析出Cursor, 通过移动Cursor, 找到所有匹配的结果.
1 | public void showBooks(View view) { |
效果
ContentProvider封装了跨进程共享的逻辑, 我们只需要Uri即可访问数据, 使用共享数据非常便捷, 需要掌握简单的使用方式.
OK, that’s all! Enjoy it!
最初发布地址:
http://www.wangchenlong.org/2016/08/07/1608/072-share-data-by-cp/
欢迎Follow我的GitHub, 关注我的简书, CSDN, 掘金.
我已委托“维权骑士”为我的文章进行维权行动. 未经授权, 禁止转载, 授权或合作请留言.