学习目标
- 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: