ContentProvider 

1: 作用:最重要的作用就是给其他的应用提供,IPC
2: 通过方法统一管理方法,几个方法的返回值的作用,insert,update,delete,getType,
3: uri操作,uri的匹配的问题,可以匹配多个情况,*匹配字符,#匹配数字。不用自己手动的去写过滤。
4: ContentObserver, 构造方法详解,千万要记住要注销掉,不然是内存泄漏
5: Permission,只有申请了权限了的才能够访问到数据,否则不可以,为了数据的安全

1 : 没有ContentProvider 也是可以直接操作数据库的,但是有了ContentProvider 可以更好的方法管理,同时最关键的就是给其他的应用提供数据。

ContentProvider 的优点:

1: 给其他的应用提供方法,对外进行共享
2: 规范database的管理,不用手动操作数据库,统一了数据的访问方式,可以通过提供给的api操作
3: UriMatcher 和ContentUtils 可以帮助uri过滤
4: 可以通知其他应用,数据变化了

2: ContentProvider中各个方法

1:onCreate 方法一般要求返回true
true if the provider was successfully loaded, false otherwise
2:getType() 返回我们操作的内容类型,例如文本文件,mp3文件,html,text文件。plain/text。一般返回null
3:onDelete返回的是删除了几个数据
4:insert() 返回的是心插入的数据的uri
5:update()返回的是也是影响了多少个数据

3: URI 操作

/**
内容提供者的authority 是可以说是主机名或者是
和service的intent filter的action 类似package 类似,就是要可以找到它
com.kodulf.provider.student 这个的格式,这个是唯一标示,相当于是网站的域名。uri的schema 就是content,因为我们就是内容提供者嘛,哈哈哈?,这个就已经被android 系统固定了,只要看到uri的schema 是content 的我们的第一反应就是访问的内容提供者中的数据。1: 如果要操作person表中id 为10的数据 content://authority/person/10
2: 如果要操作person 表中id为10的数据的name 字段 content://authority/person/10/name
3: 如果要操作person 表中所有的数据 content://authority/person
4: 如果要操作xxx表数据 content://authority/xxxURI 的判断UriMatcher:
1: 匹配现有的表或者是单个数据
2: 如果没有匹配到需要抛出异常
*/static UriMatcher mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);public static final int STUDENT_CODE = 1;
public static final int STUDENT_NUMBER_CODE = 2;
public static final int TEACHER_CODE = 3;
public static final int TEACHER_NUMBER_CODE = 4;static {mUriMatcher.addURI(AUTHRITY,MySQLiteOpenHelper.TABLE_STUDENT,STUDENT_CODE);mUriMatcher.addURI(AUTHRITY,MySQLiteOpenHelper.TABLE_STUDENT+"/#",STUDENT_NUMBER_CODE);mUriMatcher.addURI(AUTHRITY,MySQLiteOpenHelper.TABLE_TEACHER,TEACHER_CODE);mUriMatcher.addURI(AUTHRITY,MySQLiteOpenHelper.TABLE_TEACHER+"/#",TEACHER_NUMBER_CODE);
}
……
switch (mUriMatcher.match(uri)) {case STUDENT_CODE://第二个参数为字段名称long rowId = mDb.insert(MySQLiteOpenHelper.TABLE_STUDENT, null, values);//content://kodulf.contentprovider/student/10//可以有两种方法:Uri parse = Uri.parse(URI_STUDENT + "/" + rowId);Uri uri1 = ContentUris.withAppendedId(uri, rowId);getContext().getContentResolver().notifyChange(uri,null);return parse;case STUDENT_NUMBER_CODE:break;default:throw new IllegalArgumentException("Wrong parameter");
}
UriMatcher 的匹配的规则1: #代表了所有的数字
2: * 代表任意字符1: 匹配表
mUriMatcher.addURI(AUTHRITY,“student”,TEACHER_CODE);2:匹配表中的某个数据,例如student/12
mUriMatcher.addURI(AUTHRITY,“student/#”,TEACHER_CODE);3:匹配表中的某个列,例如student/name
mUriMatcher.addURI(AUTHRITY,“student/*”,TEACHER_CODE);

4: ContenObserver

ContentObserver
https://blog.csdn.net/qinjuning/article/details/7047607
uri          需要观察的Uri(需要在UriMatcher里注册,否则该Uri也没有意义了)notifyForDescendents  为false 表示精确匹配,即只匹配该Uri为true 表示可以同时匹配其派生的Uri,举例如下:假设UriMatcher 里注册的Uri共有一下类型:1 、content://com.qin.cb/student (学生)2 、content://com.qin.cb/student/# 3、 content://com.qin.cb/student/schoolchild(小学生,派生的Uri)getContentResolver().registerContentObserver(Uri.parse(MyContentProvider.URI_STUDENT), false, new ContentObserver(new Handler()) {@Overridepublic boolean deliverSelfNotifications() {return super.deliverSelfNotifications();}@Overridepublic void onChange(boolean selfChange) {super.onChange(selfChange);Log.d("kodulfdb","onChange selfChange");}@Overridepublic void onChange(boolean selfChange, Uri uri) {super.onChange(selfChange, uri);Log.d("kodulfdb","onChange selfChange, Uri uri");}
});千万要记住要注销掉

5: Permission


Permission
<!-- student provider 访问权限声明 --><permissionandroid:name="com.android.peter.provider.READ_PERMISSION"android:label="Student provider read permission"android:protectionLevel="normal"/><permissionandroid:name="com.android.peter.provider.WRITE_PERMISSION"android:label="Student provider read permission"android:protectionLevel="normal"/><!-- 声明ContentProvider --><application...<providerandroid:name=".StudentContentProvider"android:authorities="com.android.peter.provider"android:readPermission="com.android.peter.provider.READ_PERMISSION"android:writePermission="com.android.peter.provider.WRITE_PERMISSION"android:process=":provider"android:exported="true"/>...</application>为了方便起见,权限声明时protectionLevel设置的是最低风险权限(normal),关于其他等级权限和说明如下:权限等级说明
normal 低风险权限,只要申请了就可以使用,安装时不需要用户确认
dangerous 高风险权限,安装时需要用户确认授权才可使用。
signature 只有当申请权限应用与声明此权限应用的数字签名相同时才能将权限授给它。
signatureOrSystem 签名相同或者申请权限的应用为系统应用才能将权限授给它。使用地方就需要申明权限了:
<uses-permission android:name="bjpkten.contentproviderdemo30min.contentprovider"></uses-permission>

【精】ContentProvider相关推荐

  1. 精讲精练_参悟Android核心技术-张晓飞-专题视频课程

    精讲精练_参悟Android核心技术-92074人已学习 课程介绍         如果你没有Android基础, 它是你的首选:从搭建环境开始,逐步讲解四大组件.用户界面.数据存储等核心知识: 如果 ...

  2. 《Android应用开发精解》

    <Android应用开发精解>已经投放市场,当当和京东都有售,欢迎大家购买阅读,并且批评指正.写技术书籍,不是为了收入,因为稿费实在是太少了.写书只是希望能够把一些实践经验分享给各位开发者 ...

  3. AI框架精要:设计思想

    AI框架精要:设计思想 本文主要介绍飞桨paddle平台的底层设计思想,可以帮助用户理解飞桨paddle框架的运作过程,以便于在实际业务需求中,更好的完成模型代码编写与调试及飞桨paddle框架的二次 ...

  4. 高精地图与自动驾驶(下)

    高精地图与自动驾驶(下) 二.高精地图与自动驾驶 谈到高精地图对自动驾驶的作用,可以对比自动驾驶和人类驾驶的流程的相通性. 人驾驶的时候以眼睛为主,耳朵辅助观察测量环境:自动驾驶车用多种传感器包括摄像 ...

  5. 高精地图与自动驾驶(上)

    高精地图与自动驾驶(上) 前言 自动驾驶的实现主要有三个步骤:感知.决策规划.行车控制.这与你走路上班/上学的逻辑是相似的:眼睛看到画面,告诉大脑,然后你就知道了自己在哪里,以及要往哪个方向走,并指挥 ...

  6. 高精地图中导航标识识别

    高精地图中导航标识识别 思路 主要介绍高精地图导航标识识别上的技术演进,这些技术手段在不同时期服务了高精地图产线需求. 高精地图介绍 当你开车导航的时候,导航地图会向我们推荐一条或几条路线,有些地图甚 ...

  7. ContentProvider是如何实现数据共享的

    ContentProvider用于跨进程通讯,一个程序可以通过实现一个ContentProvider的抽象接口将自己的数据完全暴露出去,而且ContentProvider是以类似数据库中表的方式将数据 ...

  8. 【C++自我精讲】基础系列二 const

    [C++自我精讲]基础系列二 const 0 前言 分三部分:const用法.const和#define比较.const作用. 1 const用法 const常量:const可以用来定义常量,不可改变 ...

  9. 数据结构题及c语言版答案9.14,十套数据结构试题+答案+难题解析(精校版)

    十套数据结构试题+答案+难题解析(精校版) 更新时间:2017/2/9 10:47:00  浏览量:643  手机版 数据结构试卷(一) 一.单选题(每题 2 分,共20分) 1. 栈和队列的共同特点 ...

最新文章

  1. python开发网页有优势吗_Python用来做Web开发的优势有哪些
  2. 15个最热门的GitHub库
  3. springcloud系列九 整合Hystrix Dashboard
  4. ibatis代码生成器
  5. linux面试题-基础题1
  6. centos sudo不能运行_Linux操作系统中sudo的使用和sudoers配置
  7. mysql数据库备份心得
  8. python 命令行解析函数_python命令行解析之parse_known_args()函数和parse_args()使用区别介绍...
  9. axios框架里面如何使用get,post,通用ajax方法请求。
  10. 如何从技术上“绞杀”盗链者?
  11. linux 测试t3协议,Yealink网络电话SIP-T38G本地文件包含漏洞
  12. 几个文本处理工具的简单使用(wc,cut,sort,uniq,diff和patch)
  13. python series拼接_pandas数据拼接的实现示例
  14. (金税盘版)开票软件,登录提示密钥容器不存在,怎么处理?
  15. JS验证邮箱 身份证 VISA 卡[转]
  16. 2022 火狐插件 Tamper Data 下载安装使用教程
  17. What kind of new area will CFun and creation form?
  18. 热敏电阻和压敏电阻的区别与特性
  19. bpython3 推送_【python 3】 列表方法操作汇总
  20. FFmpeg H264增加SEI

热门文章

  1. iOS 使用 SceneKit 实现全景图
  2. VMware卸载不干净导致无法重安
  3. 数据、数据元素、数据项和数据对象
  4. Windows运行Nacos
  5. oracle 把结果加上百分号_用一条sql语句显示数据百分比并加百分号
  6. 瑞芯微RK3568对比RK3399性能解析
  7. mysql版本升级手册
  8. Java单精度与双精度区别_java单精度和双精度的区别
  9. postgreSql数据库学习使用
  10. Win32 ListBox控件