介绍
- 他是四大组件之一!
- 内容提供者,将自身的数据库提供给其他程序访问!
- 如果你不打算把自己的数据库数据分享给其他程序,那么无需创建内容提供者!
- ContentProvider ContentResolver
- 提供和获取数据的范围就是在一个手机中
ContentResolver访问ContentProvider数据
- 概念图
- 使用步骤
- 获取ContentResolver对象
Context.getContentResolver()
- 获取对应的Uri(Uri指向ContentProvider具体的哪个表)
- ContentResolver的四个方法
- 查询:
- ContentResolver:
query(Uri,字段名,条件,占位符,orderBy)
- SQLiteDatabase:
query(表名,字段名,条件,占位符,roupBy,having,orderBy)
- ContentResolver:
- 删除:
- ContentResolver:
delete(Uri,条件,占位符)
- SQLiteDatabase:
delete(表名,条件,占位符)
- ContentResolver:
- 修改:
- ContentResolver:
update(Uri,ContentValues,条件,占位符)
- SQLiteDatabase:
update(表名,ContentValues,条件,占位符)
- ContentResolver:
- 插入:
- ContentResolver:
inser(Uri,ContentValues)
- SQLiteDatabase:
inser(表名,null,ContentValues)
- ContentResolver:
- 查询:
- 操作通话记录
Calls.Content_URI
- 操作通讯录
private String uri_raw = "content://com.android.contacts/raw_contacts";
private String uri_data = "content://com.android.contacts/data";- raw_contacts
- data
- mimetypes
- Cursor关闭的问题(重点!!!):
- Cursor在没有用的时候,必须要关闭!
- 关闭方法为cursor.close();
- 注意:Cursor在没有使用完的情况下,不要关闭,否则影响数据显示!
- 获取ContentResolver对象
ContentProvider自定义
- 需求:
- 创建数据库:SQLiteOpenHelper
- 暴露数据:ContentProvider
- 创建时间:
- Application -> onCreate()方法,当程序创建的时候调用
Activity -> onCreate()方法,当打开对应Activity的时候调用
ContentProvider -> onCreate()方法,当ContentProvider创建时候调用 - 出现的先后顺序:
- ContentProvider的onCreate()方法 –> Application的onCreate()方法 –> Activity的onCreate()方法
- -
- Application -> onCreate()方法,当程序创建的时候调用
- 使用方法:
- 创建数据库
- 创建以各类去继承ContentProvider
- onCreate():打开数据库,获取数据库操作工具类对象
- getContext()可以获得上下文对象
- onCreate():打开数据库,获取数据库操作工具类对象
- 设计路径结构
- 开发者通常通过追加指向单个表的路径来根据权限创建内容 URI。例如,如果您有两个表:table1和table2,则可以通过合并上一示例中的权限来生成内容 URI com.example..provider/table1和com.example..provider/table2。路径并不限定于单个段,也无需为每一级路径都创建一个表。
- 创建静态代码块,给匹配器添加匹配Uri
//优先执行
static{
//创建对象不匹配
matcher = new UriMatcher(UriMatcher.NO_MATCH);
//content://authority/表名
matcher.addURI(AUTHORITY, tableName, CODE);
}
其中AUTHORITY为常量字符串,CODE为常量整数,二者都为全局变量,AUTHORITY为content://authority/
,CODE用于与完整Uri对应,方便使用switch语句判断
- 重写操作方法
- query、insert、update、delete
- 匹配器 匹配传递过来的Uri 区分操作表
int code = UriMacther.match(uri) - 具体操作数据库
SQLiteDataBase 操作数据库
- 声明ContentProvider
<provider
android:name="com.example.android_day14_contentprovider_01.MyProvider"
//Uri 中间部分需要声明
//在同一个手机中,中间部分不能相同
android:authorities="com.example.myprovider.provider"
//是否支持其他程序访问
android:exported="true"
android:permission="" 读写权限
android:readPermission="" 读权限
android:writePermission="" 写权限>
- 自定义权限
- 权限就是一个字符串!但是这个字符串必须声明!
<permission
android:name="this is a permission"
android:label="这是自定义权限的说明"
android:protectionLevel="normal" >
</permission>