在我们Android开发中难免会用到Content Provider,主要是为了实现进程间访问数据,数据库是Android开发中最基本的数据保存方式,但由于数据库的私有性,我们无法对外提供或获取信息,当两个应用需要实现数据共享时,此时就需要本篇文章的主题——ContentProvider

一.提供数据端-contentprovider

1.首先新建一个自己的content provider类继承自ContentProvider,重写onCreate insert query update delete getType方法,在里面做一些自己的对数据操作方法供外部调用,另外需要用UriMatcher 类对访问数据路径Uri进行初始话,指明authorities,Uri路径类似content://authorities/path。

public class CourseContentProvider extends ContentProvider {private final String TAG = this.getClass().getName();private Context mContext;private DBHelper mDbHelper = null;private SQLiteDatabase db = null;public static final String AUTOHORITY = "com.lmy.provider";public static final String COURSE_PATH = "course";private static final int PROVIDE_COURSE = 1;private static final UriMatcher mMatcher;static {mMatcher = new UriMatcher(UriMatcher.NO_MATCH);mMatcher.addURI(AUTOHORITY, COURSE_PATH, PROVIDE_COURSE);// 若URI资源路径 = content://com.lmy.provider/course ,则返回注册码 PROVIDE_COURSE}/*** 初始化ContentProvider*/@Overridepublic boolean onCreate() {Log.d(TAG,"onCerate,current thread:"+Thread.currentThread().getName());return true;}/*** 添加数据*/@Overridepublic Uri insert(Uri uri, ContentValues values) {Log.d(TAG,"insert,current thread:"+Thread.currentThread().getName());return uri;}/*** 查询数据*/@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {Log.d(TAG,"query,current thread:"+Thread.currentThread().getName());return null;}/*** 更新数据*/@Overridepublic int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {Log.d(TAG,"update,current thread:"+Thread.currentThread().getName());return 0;}/*** 删除数据*/@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {Log.d(TAG,"delete,current thread:"+Thread.currentThread().getName());return 0;}@Overridepublic String getType(Uri uri) {Log.d(TAG,"getType,current thread:"+Thread.currentThread().getName());return null;}/*** 根据URI匹配 URI_CODE,从而匹配ContentProvider中相应的表名*/private String getTableName(Uri uri) {String tableName = null;switch (mMatcher.match(uri)) {case 1:tableName = DBHelper.USER_TABLE_NAME;break;case 2:tableName = DBHelper.JOB_TABLE_NAME;break;}return tableName;}
}

2.就是在AndroidManifest里面声明content provider,代码如下

      <providerandroid:name="com.example.contentproviderdemo.CourseContentProvider"android:authorities="com.lmy.provider"android:exported="true"android:readPermission="com.example.contentproviderdemo.READ"android:writePermission="com.example.contentproviderdemo.WRITE" />

参数简介

这里需要注意的就是自定义权限,如果这里没有添加readPermission writePermission,那么第三方应用在调用时也不需要申请此权限就可以访问数据库进行读写;如果这里添加了这两个权限,那么首先我们要明确这两个是属于自定义权限,需要在此处(也是就content provider 端)将这两个权限添加到系统中,这样第三方应用在申请这两个权限时系统才知道是要申请哪个权限,然后就是第三方应用需要像平时那样申请权限的方式将这两个自定义权限申请一下,这里需要注意一个坑,这种自定义权限系统只会在安装您的应用时,才会隐式允许此请求,也就是说当你第一次编译安装apk时没有去申请这两个权限,那么后来你添加了之后再编译是不生效的,只能删了apk重新再编译安装apk才可以生效(困了我一下午的坑)。

3.在系统中注册自定义权限

   <permissionandroid:name="com.example.contentproviderdemo.READ"android:label="provider pomission"android:protectionLevel="normal" /><permissionandroid:name="com.example.contentproviderdemo.WRITE"android:label="provider pomission"android:protectionLevel="normal" />

二.访问数据端-contentresolver

1.首先在AndroidManifest中申请provider的自定义权限,代码如下:

   <uses-permission android:name="com.example.contentproviderdemo.READ"/><uses-permission android:name="com.example.contentproviderdemo.WRITE"/>

2.在使用的地方通过  ContentResolver  类访问 provider 提供的数据库数据,此处的Uri路径要保证跟前面provider中的一致,贴代码:

public class MainActivity extends AppCompatActivity {private ContentResolver mContentResolver;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mContentResolver = this.getContentResolver();}public void onClickTest(View view) {Uri uri = Uri.parse("content://com.lmy.provider/course");mContentResolver.query(uri, null, null, null, null);
//        mContentResolver.delete(uri,null,null);
//        mContentResolver.insert(uri, null);}
}

最后测试可以走到query中,对应输出日志如下,可以看到onCreate 和 query不在一个进程中,一个在main线程,一个在Binder线程:

2021-03-04 19:05:30.769 31059-31059/com.example.contentproviderdemo D/com.example.contentproviderdemo.CourseContentProvider: onCerate,current thread:main
2021-03-04 19:06:07.391 31059-31077/com.example.contentproviderdemo D/com.example.contentproviderdemo.CourseContentProvider: query,current thread:Binder:31059_1

三.总结

到此文章已经讲解完毕,这里只是简单的进行了不同进程间访问数据的一个调用demo,仅仅是已输出日志形式来看的,具体操作数据库那块没有添加,感兴趣的小伙伴可以用 SQLiteDatabase 进行操作,大家有什么问题欢迎在下面留言评论,我们下期见!

Android 开发 Content Provider 使用 demo相关推荐

  1. 浅析调用android的content provider(一)

            在Android下,查询联系人.通话记录等,需要用到content provider.但是,调用content provider时,Android框架内部是如何做的呢?这一系列文章就是 ...

  2. Android开发-营养成分查询Demo(1)前言-AndroidStudio

    转载请注明出处:http://blog.csdn.net/iwanghang/article/details/70882420 觉得博文有用,请点赞,请评论,请关注,谢谢!~ 之前公司有个洽谈的项目, ...

  3. Android Content Provider Security

    0x00 科普 内容提供器用来存放和获取数据并使这些数据可以被所有的应用程序访问.它们是应用程序之间共享数据的唯一方法:不包括所有Android软件包都能访问的公共储存区域.Android为常见数据类 ...

  4. Android开发从入门到精通

    Android开发从入门到精通 --Android经典教程 目 录 目 录 1 第一章 什么是Android 1 什么是Android - 嵌入式设备编程的历史-第一章(1) 1 开放手机联盟和And ...

  5. Android开发学习笔记:浅谈Content Provider

    一.Content Provider的概念介绍 Content Providers是所有应用程序之间数据存储和检索的桥梁,它使得各个应用程序之间实现数据共享.是应用程序间共享数据的唯一途径.Conte ...

  6. Android应用安全之Content Provider安全

    android平台提供了Content Provider,将一个应用程序的指定数据集提供给其它应用程序.这些数据可以存储在文件系统.SQLite数据库中,或以任何其它合理的方式存储.其他应用可以通过C ...

  7. Android应用程序组件Content Provider简要介绍和学习计划

    在Android系统中,Content Provider作为应用程序四大组件之一,它起到在应用程序之间共享数据的作用,同时,它还是标准的数据访问接口.前面的一系列文章已经分析过Android应用程序的 ...

  8. android Content provider 组件

    Content Provider 属于Android应用程序的组件之一,作为应用程序之间唯一的共享数据的途径,Content Provider 主要的功能就是存储并检索数据以及向其他应用程序提供访问数 ...

  9. 【转】Pro Android学习笔记(八):了解Content Provider(下中)

    在之前提供了小例子BookProvider,我们回过头看看如何将通过该Content Provider进行数据的读取. (1)增加 private void addBook(String name , ...

最新文章

  1. OpenCV点分类器points classifier的实例(附完整代码)
  2. 第三周总结 类、对象、包
  3. 云小课 | 华为云KYON:网段零修改上云,简单又好用
  4. 严重的 iOS 漏洞可导致拒绝服务或任意代码执行,苹果已修复
  5. Microsoft Windows XP SP3 官方原版镜像下载,绝对原版加系列号!
  6. FMEA学习(2软件)
  7. Idea设置字体大小
  8. 红包裂变被动吸粉引流方法,如何通过红包裂变的方式吸粉
  9. 约当标准型_特征向量到约当标准型
  10. 【趣味实践】自动补帧算法——RIFE的使用
  11. 主流手机CPU及机型介绍!手机CPU生产厂商介绍!高通QSD8250、MSM8255、TI OMAP 3630、nVIDIA Tegra 2介绍
  12. C语言中access的使用
  13. Unity NavMesh寻路 A*(A star)分析及实例应用(一)
  14. FFmpeg一些感想
  15. Unity3D-FingerGestures控制相机 Pinch Drag Click Swip等
  16. 四川理工计算机专业好不好,急!!!!四川理工 、 宜宾学院 、 内江师范学院 哪个学校计算机专业好点?...
  17. 游戏企业该如何做好网络安全防护?
  18. dedecms图片绝对路径(附件绑定域名)的设置方法
  19. linux键盘错位1格,键盘按键错乱,教您修复键盘按键错乱的方法
  20. 从内盘外盘的变化中看趋势

热门文章

  1. 最新x64dbg软件-比OD更好的工具
  2. IDM(Internet Download Manager)另存为路径的记录怎么删除
  3. 乐视(letv)网tkey破解
  4. php 中insert into,php – INSERT INTO SQL Heredoc正确的语法
  5. CSS:元素的显示与隐藏
  6. python add_argument() 方法详解
  7. 台电P85HD双核(K6N2),电子书阅读,文件共享,及其他应用
  8. 7-2 正负数统计 (100 分)
  9. 索爱手机android系统,索爱正式发布Android系统Walkman音乐手机
  10. nodejs全局变量设置设置