ContentProvider 的使用

2 阅读2分钟

ContentProvider 完整全部方法(Android 原生抽象类)

ContentProvider 是抽象类,必须重写下面6 个核心方法,外加生命周期辅助方法,分两类说明:

一、必须实现的 5 个业务核心方法(CRUD + call)

1. query 查询数据(对应读表)

kotlin

override fun query(
    uri: Uri,
    projection: Array<String>?,      // 需要查询的列名
    selection: String?,              // where 条件
    selectionArgs: Array<String>?,   // where 占位符参数
    sortOrder: String?               // 排序
): Cursor?

用途:查询结构化表格数据,返回游标。

2. insert 插入单行

kotlin

override fun insert(uri: Uri, values: ContentValues?): Uri?

用途:新增一行记录,返回代表该行的 Uri。

3. update 更新多行

kotlin

override fun update(
    uri: Uri,
    values: ContentValues?,
    selection: String?,
    selectionArgs: Array<String>?
): Int

返回值:受影响的行数。

4. delete 删除多行

kotlin

override fun delete(
    uri: Uri,
    selection: String?,
    selectionArgs: Array<String>?
): Int

返回值:删除的行数。

5. call 自定义扩展方法(你前面问的重点)

kotlin

override fun call(
    method: String?,    // 自定义方法名,区分业务
    arg: String?,      // 简单字符串参数
    extras: Bundle?    // 复杂参数,可存 Parcelable
): Bundle?

适用:无表操作、跨进程函数调用、传递复杂实体(如 DataCenterResult)。

二、强制重写:getType(MIME 类型)

kotlin

override fun getType(uri: Uri): String?

作用:根据 Uri 返回对应数据的 MIME 类型,系统组件(相册、文件选择器)会依赖这个方法。

  • 单条数据:vnd.android.cursor.item/xxx
  • 多条集合:vnd.android.cursor.dir/xxx

三、生命周期回调方法(可选重写)

1. onCreate

kotlin

override fun onCreate(): Boolean

CP 进程初始化时执行,用来初始化数据库、管理器、全局资源。返回 true 代表初始化成功。

2. shutdown

kotlin

override fun shutdown()

进程销毁前回调,释放数据库、关闭连接、清理缓存。

四、批量事务辅助方法(可选重写,高级场景)

applyBatch

批量执行一组增删改操作,支持事务,适合大批量数据:

kotlin

override fun applyBatch(operations: ArrayList<ContentProviderOperation>): Array<ContentProviderResult>

bulkInsert

批量插入多条数据,优化性能:

kotlin

override fun bulkInsert(uri: Uri, values: Array<ContentValues>): Int

五、方法用途快速区分总结

  1. 有数据表、多行结构化数据:用 query / insert / update / delete
  2. 纯功能调用、无表、传复杂 Parcelable、指令操作:用 call()
  3. getType:系统必须,不能省略
  4. onCreate:初始化资源
  5. applyBatch / bulkInsert:大批量数据优化
  6. shutdown:资源释放

最简实现模板框架

kotlin

class DataCenterProvider : ContentProvider() {

    override fun onCreate(): Boolean {
        // 初始化
        return true
    }

    override fun query(uri: Uri, projection: Array<String>?, selection: String?, selectionArgs: Array<String>?, sortOrder: String?): Cursor? = null

    override fun insert(uri: Uri, values: ContentValues?): Uri? = null

    override fun update(uri: Uri, values: ContentValues?, selection: String?, selectionArgs: Array<String>?): Int = 0

    override fun delete(uri: Uri, selection: String?, selectionArgs: Array<String>?): Int = 0

    override fun getType(uri: Uri): String? = null

    override fun call(method: String?, arg: String?, extras: Bundle?): Bundle? {
        // 自定义跨进程接口写这里
        return super.call(method, arg, extras)
    }
}