ContentProvider为何物?

前言:接触android有些日子了,内容提供器这部分一直用不到,也没有好好学过。所以我这个虚伪的android开发者决定花时间一探究竟。

什么是内容提供器,为什么要有内容提供器?这个问题我们可以从一些APP访问系统通讯录数据这个场景说起。android提供了文件存储,sqlite等都只提供应用内数据分享,sharedpreference提供了可供其他应用访问的模式但是由于安全性不高所以不再使用。
简单来说,现有的技术不足,需求依旧存在。所以contentprovider就应运而生。

*intent.setData(Uri.parse(“tel:10086”));
记录一个小坑,uri.parse的参数要严格按照格式来,如果直接传入“10086”将会导致程序crash!

EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
自己坑自己系列,这个地方要准确的把权限请求的结果转接过来处理,this参数不能少!!

关于uri 和 url:

内容提供器涉及到几个概念:
uri地址,contentresolver,cursor

uri地址:内容提供器类似于sqlitedatabase但是不同于sqlitedatabase,它不接收表名参数,取而代之的是uri地址

URI格式:authority+path
——authority一般以程序的包路径赋值,example:com.example.app
——path 反斜杠/加上表名,example:/table1
合起来uri地址:example:com.example.app/table1
等等,好像还不可以,格式不好辨认!
标准格式:content://example:com.example.app/table1
至此,这个uri可以很清楚的表示我们将要访问的地址。

当然,这里的uri还只是个string串,要通过Uri.parse()方法格式为Uri对象使用。

contentresolver:
.实现内容提供器的主要功能类,是context的内置类
.使用之前我们可以通过getcontentresolver()方法来获取
.query(),insert(),updata(),delete 这四个方法对应着CRUD四种操作。

cursor:
光标?,喵喵喵????
传送门 :Android中的Cursor到底是什么?如何理解Cursor的方法都在做什么事情?

如何访问其它应用提供的内容提供器/
1,新建对应内容提供器的URI对象
2,用URI对象获得访问对应内容提供器内存的指针cursor
——获取contentresolver
——执行query()方法
————uri 指定查询某个应用程序下的某一张表
————projection 指定查询的列名
————selection指定where的约束条件
————orderby指定查询结果的排序方式
3,执行cursor的movetonext方法,一行一行的读出提供器中的数据
4,新增数据,新增数据和数据库的操作差不多
——新建一个contentvalues对象,向这个对象中写入put()数据(使用方法和map一样,列名为键值,后面放具体数据)
——执行insert方法
5,更新数据
——新建一个contentvalues对象,向其中写入自己想要改的列名和值
——执行update方法,涉及四个参数
————uri
————values将要写入的数据
————“??”
————具体数值,后两个参数等于sql中的where语句

6,delete
直接执行delet方法
——uri
————“??”
————具体数值,后两个参数等于sql中的where语句

2018年6月3日20:29:13,现在是晚上了,内容提供器部分看的差不多了(效率挺低,从早上开始看的,顺带回顾昨天的数据库和权限知识)

说一下自己的理解,内容提供器其实是一道门,门里面是我们的数据库database,门外面是其它应用。其它应用根据uri地址追寻而来,找到自己要操作的东西操作一通(当然了,哪些东西能碰哪些东西不能碰这在这扇门造好的时候就规定好了)。

contentprovider是依存于database的,没有database的画,contentprovider也没意义。
内容提供器这部分技术需要清晰的了解uri的构造及其含义。
使用步骤:
android为我们提供了databaseopenhelper接口来操作数据库,新建一个helper并继承此接口实现创建更新插入删除等功能

可以借助androidstdio提供的快捷方式创建contentprovider,那样免了手动编辑manifest

实现其中各项功能,uridispatch来存储定义好各类uri,并在重载的各个provider方法中根据uri的类型来进行数据库操作,返回更新行列数或者是cursor。

PS : 说简单就简单,说难也挺麻烦,熟能生巧。

猜你喜欢

转载自blog.csdn.net/qq_23343197/article/details/80559976