android 基础(二)ContentProvider内容提供器

学习目标

  • ContentResolver访问系统数据
  • 自定义ContentProvider

ContentResolver访问系统数据

该demo为获取手机联系人

private ArrayAdapter adapter;
private List contactList = new ArrayList<>();
现存三苏祠祀

首先通过ContextCompat.checkSelfPermission()获取手机联系人权限。
checkSelfPermission()方法:

  • 参数一: context: 这里是MainActivity.this
  • 参数二: String: 所需权限名

当用户授权后就直接跳到ReadContacts()方法,如果没有授权的话,通过ActivityCompact.requestPermissions()向用户申请权限。
requestPermission()方法:

  • 参数一:context : 这里是MainActivity.this
  • 参数二:String[] : 将所需权限名放入到String数组中
  • 参数三:requestCode : 要求为唯一值

在这里插入图片描述

刚才requestPermission()方法向用户申请权限,无论用户是拒绝还是授权,最后都会回调onRequestPermissionResult()方法,授权结果存储在
grantResults中,最后判断一下授权结果,授权则执行获取联系人数据,否则结束。

在这里插入图片描述

getContentResolver()方法获取一个ContentResolver对象

query()方法参数如下:
在这里插入图片描述

这里ContactsContact.CommonDataKinds.Phone类封装了CONTENT_URI常量,这是Uri.parse()方法解析出来的。
在这里插入图片描述
即内容URI标准格式:
Uri uri = Uri.parse(“content://author”)

  • com.example.app.provider : 表示author,即包名
  • table1 : 表示path,即表名
  • content:// : 表示协议声明

查询完成后返回Cursor对象,通过移动游标位置来遍历Cursor所有行并取出每行中相应列数据。
notifyDataSetChanged方法通过一个外部的方法控制如果适配器的内容改变时需要强制调用getView来刷新每个Item的内容。

在这里插入图片描述
最后在AndroidManifest.xml中注册读取联系人权限

自定义ContentProvider

自定义ContentProvider

MyDataBaseHelp类:继承SQLiteOpenHelper类并重写onCreate()和onUpgrade()方法
在这里插入图片描述

创建数据表
在这里插入图片描述

MyContentProvider类:
继承ContentProvider并重写下面方法:

  • onCreate(): 完成对数据库的创建和更新,返回True表示内容提供器初始化成功,否则失败
  • query:查询数据,查询结果存储在cursor对象中返回
  • update:更新数据,将更新受影响的行数返回
  • insert:向内容提供器中添加数据,完成后返回一个记录该条记录的Uri
  • delete: 删除数据,将删除受影响的行数返回
  • getType:获取Uri类型
    在这里插入图片描述
    初始化UriMatcher,uriMatcher.addURI()注册Uri

在这里插入图片描述
一个内容URI对应的MIME字符串由3部分构成:

  • 必须以vnd开头
  • 如果内容URI以路径结尾,则后接android.cursor.dir/, 如果内容URI以id结尾,则后接android.cursor.item/
  • 最后接上vnd..

在这里插入图片描述
query()方法中先获取SQLiteDataBase对象,根据Uri判断访问哪张表,SQLiteDataBase.query()查询数据并将Cursor对象返回

在这里插入图片描述
insert()方法中先获取SQLiteDataBase对象,根据Uri判断访问哪张表,SQLiteDataBase.insert()返回受影响行数,调用Uri.parse()将内容URI解析为Uri对象并返回

在这里插入图片描述
delete()方法中先获取SQLiteDataBase对象,根据Uri判断访问哪张表,SQLiteDataBase.delete()将被删除行数作为返回值返回

在这里插入图片描述
update()方法中先获取SQLiteDataBase对象,根据Uri判断访问哪张表,SQLiteDataBase.update()将更新行数作为返回值返回

在这里插入图片描述
在ActivityManifest.xml中注册内容提供器

ContentResolver

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

显示结果如下:
insert:
在这里插入图片描述

update:
在这里插入图片描述

代码链接

代码链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值