持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第26天,点击查看活动详情
什么是内容提供者?
内容提供商
- 当一个应用想要向另一个应用提供数据时使用
- 发出请求时,它由 ContentResolver 类处理。
- 数据可以以DB、文件、网络等多种方式存储。
为什么是 ContentProvider?
- 通过在 DB 前面放置一层抽象,不同的应用程序可以使用相同的代码访问 ContentProvider。
-> 它是安全的,因为它不直接访问数据库。 - 当不同的应用程序 CRUD 时,您可以使用 ContentProvider 来检查权限和数据安全(规则)。
- CursorLoad 和 CursorAdapter 等类使用 ContentProvider。
- 一台 Android 设备中可能存在多个 ContentProvider。
- 我需要知道特定内容正在与哪个应用程序通信并保持所有数据同步。
=> 你可以用 ContentProvider 解决这个问题。
如何使用?
- 当 ContentResolver 调用以下方法之一时,ContentResolver 会向 ContentProvider 发送请求。
-> query() : 读取数据
-> insert() : 添加行到数据
-> update() : 更新数据
-> delete() : 从数据中删除行
对 ContentResolver 的引用
- 使用该引用调用查询方法
- 它将 URI、projection、selection、selectionArgs 和 sortOrder 作为元素。
- URI(统一资源标识符):用于指示数据的位置和获取数据
类型:“:content://authority/path/id”
ex) content://com.android.contacts/contacts
-> content: // : 表示 URI
-> authority : 充当 key / Duplicate x / 主要使用包名
-> path : 虚拟路径
-> 如果连 id 都有,只导入一个数据 fetch data - projection : 过滤,表示要获取的值
- 选择:如何过滤,如何导入
- 选择参数:过滤什么
- 排序顺序:数据的排序顺序
-> 在查询中
select {projection}
from {URI}
where {selection} = {selection arguments}
orderby {sort order}
获取形式的值
- 有些不需要权限,有些则需要。
-> 主要在应用内导入数据时不需要权限,但在应用外获取数据需要权限。
内容提供者访问
- 意图访问
- 使用光标
- 使用游标适配器
UriMatcher
val uriMatcher = UriMatcher(UriMatcher.NO_ACTION).apply{
addURI(Notes.AUTHORITY, "notes",NOTES)
addURI(Notes.AUTHORITY, "notes/0", NOTE_ID)
}
...
override fun delete(...){
when(uirMatcher.match(uri){
NOTES -> {
//error
}
NOTE_ID -> {
val id = ContentUris.parseId(uri)
...
}
}
}
- 分析 uri 以确定它是单数还是复数。
- 注意:以 notes(path) -> 复数结尾的东西
- NOTE_ID :具有特定 id -> 单数的东西