ContentResolver的增删改查方法示例
Android 中 ContentResolver 的增删改查详解
ContentResolver 是 Android 提供的 API,用于在不同应用程序之间访问和操作数据,通常与 ContentProvider 一起使用。它提供 增(insert)、删(delete)、改(update)、查(query) 操作,常见于访问系统数据库(如通讯录、媒体库等)或应用自定义的数据库(如日记本、笔记等)。
📌 使用 ContentResolver 的步骤
- 确定
ContentProvider提供的数据 URI(content://格式) - 获取
ContentResolver对象 - 执行增、删、改、查操作
- 处理权限(如果是访问系统数据)
- 关闭
Cursor以释放资源(仅query需要)
💡 1. 获取 ContentResolver
在 Activity 或 Fragment 中:
1 | val contentResolver = context.contentResolver |
在 Service 中:
1 | val contentResolver = applicationContext.contentResolver |
🔍 2. 查询数据(query)
查询 ContentProvider 提供的数据,返回 Cursor,需手动遍历和关闭。
示例:查询日记
1 | // 1. 目标 ContentProvider 的 URI |
🔹 注意事项:
- 查询时使用
LIKE支持模糊匹配,?代表参数占位符 - 使用
Cursor需要调用.moveToNext()逐行读取 - 关闭
Cursor以释放资源
📝 3. 插入数据(insert)
用于新增数据,返回新数据的 Uri。
示例:新增日记
1 | val uri = Uri.parse("content://com.example.provider/diary") |
🔹 注意事项:
ContentValues类似Map,用于存储字段和值insert()返回新数据的Uri,失败时返回null- newUri:表示新插入的数据的 URI,用于后续操作。如果插入失败,返回
null。
✏ 4. 更新数据(update)
用于修改已有数据,返回影响的行数。
示例:更新日记内容
1 | val uri = Uri.parse("content://com.example.provider/diary") |
🔹 注意事项:
selection是 SQL 语法的WHERE子句update()返回更新的行数,可能为0(表示数据未找到)
🗑 5. 删除数据(delete)
用于删除数据,返回删除的行数。
示例:删除指定日记
1 | val uri = Uri.parse("content://com.example.provider/diary") |
🔹 注意事项:
delete()返回删除的行数- 不提供
selection则删除所有数据(谨慎)
📖 6. 访问系统 ContentProvider 示例
📌 读取联系人
1 | val uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI |
📌 读取相册
1 | val uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI |
🔒 7. 处理权限
如果访问系统 ContentProvider(如通讯录、相册等),需申请权限:
在 AndroidManifest.xml 申请权限
1 | <uses-permission android:name="android.permission.READ_CONTACTS"/> |
动态请求权限(Android 6.0+)
1 | if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { |
📌 总结
| 操作 | 方法名 | 主要参数 |
|---|---|---|
| 查询 | query(uri, projection, selection, selectionArgs, sortOrder) |
Uri,字段数组,查询条件,排序 |
| 插入 | insert(uri, values) |
Uri,ContentValues |
| 更新 | update(uri, values, selection, selectionArgs) |
Uri,ContentValues,条件 |
| 删除 | delete(uri, selection, selectionArgs) |
Uri,条件 |
💡 你是要操作自己的 ContentProvider 还是访问系统数据?如果是日记本的 ContentProvider,可以一起设计 URI 和数据库结构。
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.