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
五、方法用途快速区分总结
- 有数据表、多行结构化数据:用
query / insert / update / delete - 纯功能调用、无表、传复杂 Parcelable、指令操作:用
call() getType:系统必须,不能省略onCreate:初始化资源applyBatch / bulkInsert:大批量数据优化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)
}
}