1.Content Provider作用

进程间进行数据交互&共享,即跨进程通信

 
contentprovider作用图.png

2.Content Provider原理

content provider底层是采用Android中Binder机制。

2.1统一资源标识符(URI)
  • 作用:唯一标识content provider&其中的数据

外界进程通过URI找到对应的content provider&其中的数据,再进行数据操作

  • 具体使用(自定义)

     
    自定义URI
        //设置uri
Uri parse = Uri.parse("content://com.carson.provider/User/1");
//指向的资源为:名为'com.carson.provider'
//的contentProvider中表名为‘User'中的'id'为1的数据
2.2MIME数据类型
  • 指定某个拓展名的文件用某种应用程序来打开。如指定 .html文件采用text应用程序打开,指定.pdf文件采用flash应用程序打开。
  ContentProvider.getType(uri);//根据uri,返回MIME类型。

2.ContentProvider类

  • 2.1Contentprovider主要以表格的形式组织数据

    同时也支持文件数据,只是表格的数据比较多。
  • 主要方法,进程间共享数据的本质是:添加、删除、获取和修改数据。
<-- 4个核心方法 -->
public Uri insert(Uri uri, ContentValues values)
// 外部进程向 ContentProvider 中添加数据
public int delete(Uri uri, String selection, String[] selectio
nArgs)
// 外部进程 删除 ContentProvider 中的数据
public int update(Uri uri, ContentValues values, String select
ion, String[] selectionArgs)
// 外部进程更新 ContentProvider 中的数据
public Cursor query(Uri uri, String[] projection, String selec
tion, String[] selectionArgs, String sortOrder)
// 外部应用 获取 ContentProvider 中的数据
// 注:
// 1. 上述4个方法由外部进程回调, 并运行在ContentProvider进程的Binder
线程池中( 不是主线程)
// 2. 存在多线程并发访问, 需要实现线程同步
// a. 若ContentProvider的数据存储方式是使用SQLite & 一个, 则不需要, 因为SQLite内部实现好了线程同步,
// 若是多个SQLite则需要, 因为SQL对象之间无法进行线程同步
// b. 若ContentProvider的数据存储方式是内存, 则需要自己实现线程同步
<-- 2个其他方法 -->
public boolean onCreate()
// ContentProvider创建后 或 打开系统后其它进程第一次访问该ContentProvi
der时 由系统进行调用
// 注: 运行在ContentProvider进程的主线程, 故不能做耗时操作
public String getType(Uri uri)
// 得到数据类型, 即返回当前 Url 所代表数据的MIME类型

3.ContentObserver 类

内容观察者,观察Uri引起contentprovider中的数据变化并通知外界。

具体使用:

// 步骤1: 注册内容观察者ContentObserver
getContentResolver().registerContentObserver(uri);
// 通过ContentResolver类进行注册, 并指定需要观察的URI
// 步骤2: 当该URI的ContentProvider数据发生变化时,
// 通知外界( 即访问该ContentProvider数据的访问者)
public class UserContentProvider extends ContentProvider {
public Uri insert(Uri uri, ContentValues values) {
db.insert("user", "userid", values);
getContext().getContentResolver().notifyChange(uri, null);
// 通知访问者
}
}
// 步骤3: 解除观察者
getContentResolver().unregisterContentObserver( uri) ;
// 同样需要通过ContentResolver类进行解除

作者:木小伍
链接:https://www.jianshu.com/p/4b9b61f99069
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

最新文章

  1. 编译链接 C++
  2. 一次 Oracle 算出运算溢出问题 排查解决 (并非除数为零!)
  3. jQuery入门(4)jQuery中的Ajax应用
  4. js根据className获取元素封装
  5. java.lang.IllegalStateException: getWriter() has already been called for this response问题解决
  6. Windows Azure上搭建SSTP VPN
  7. 学习总结 java 数据库 ResultSet 、PreparedStatement
  8. PHP 数组转字符串,与字符串转数组
  9. PHP自练项目之发送短信内容
  10. 把div 当文字来进行布局控制
  11. Apache无法启动原因
  12. Cygwin Unable to get setup from *
  13. C#3.0中的扩展方法
  14. 优雅使用 illuminate/database 包中的 Collection
  15. Object:所有类的超类
  16. self study 权限 permission
  17. java结合testng,利用txt做数据源的数据驱动实例
  18. 一些方便系统诊断的bash函数
  19. FTR-B3GA003Z-信号继电器
  20. GBDT+LR算法解析及Python实现

热门文章

  1. Python 元组列表排序:初学者可能忽视的细节
  2. 2 .NET Core笔试题
  3. 国外的SRE都是干啥工作的?薪资如何?
  4. pat乙级1022 D进制的A+B
  5. windows注册表的读
  6. N63050 第二周运维作业
  7. SAP 交货单抬头客制化界面以及字段
  8. python 获取近几周日期
  9. mysql使用经验
  10. P1002 [NOIP2002 普及组] 过河卒