为了活动小家电- ContentProvider

30 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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 -> 单数的东西