【Android】ContentResolver的使用

在 Android 中,ContentResolver 是一个非常重要的类,它提供了与 ContentProvider 进行交互的方法。ContentProvider 是用于在不同应用程序之间共享数据的标准接口,而 ContentResolver 则是从客户端(如 Activity 或 Service)访问这些数据的途径。

ContentResolver 的主要功能

查询数据:通过 query() 方法从 ContentProvider 获取数据。

插入数据:使用 insert() 方法向 ContentProvider 添加新数据。

更新数据:利用 update() 方法修改 ContentProvider 中的数据。

删除数据:通过 delete() 方法移除 ContentProvider 中的数据。

调用自定义方法:使用 call() 方法可以调用 ContentProvider 提供的自定义函数。

使用 ContentResolver

  1. 查询数据

下面是一个简单的例子,演示如何使用 ContentResolver 查询联系人信息:

ContentResolver contentResolver = getContentResolver();

Uri uri = ContactsContract.Contacts.CONTENT_URI;

Cursor cursor = contentResolver.query(uri, null, null, null, null);

if (cursor != null) {

while (cursor.moveToNext()) {

String displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

Log.d("Contact", "Name: " + displayName);

}

cursor.close();

}

  1. 插入数据

假设我们要向某个 ContentProvider 插入一条新的记录:

Java

深色版本

ContentValues values = new ContentValues();

values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE);

values.put(ContactsContract.CommonDataKinds.Email.ADDRESS, "example@example.com");

values.put(ContactsContract.CommonDataKinds.Email.TYPE, ContactsContract.CommonDataKinds.Email.TYPE_WORK);

Uri insertedUri = getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);

  1. 更新数据

更新现有数据的例子如下:

Java

深色版本

ContentValues values = new ContentValues();

values.put(ContactsContract.CommonDataKinds.Email.ADDRESS, "new.email@example.com");

String selection = ContactsContract.CommonDataKinds.Email._ID + " = ?";

String[] selectionArgs = { "1" }; // 假设你要更新 ID 为 1 的记录

int count = getContentResolver().update(ContactsContract.Data.CONTENT_URI, values, selection, selectionArgs);

  1. 删除数据

要删除数据,可以这样做:

String selection = ContactsContract.CommonDataKinds.Email._ID + " = ?";

String[] selectionArgs = { "1" };

int deletedRows = getContentResolver().delete(ContactsContract.Data.CONTENT_URI, selection, selectionArgs);

权限管理

当你尝试访问或修改由其他应用提供的数据时,可能需要声明相应的权限。例如,读取联系人数据通常需要 READ_CONTACTS 权限,而写入则需要 WRITE_CONTACTS 权限。确保在 AndroidManifest.xml 文件中正确地声明了所需的权限,并根据需要请求运行时权限(对于 API 级别 23 及以上)。

<uses-permission android:name="android.permission.READ_CONTACTS"/>

<uses-permission android:name="android.permission.WRITE_CONTACTS"/>

总结

ContentResolver 是 Android 中实现跨应用数据共享的关键组件之一。通过它,你可以方便地与 ContentProvider 进行交互,执行数据的增删改查操作。无论是访问内置的提供者(如联系人、媒体库等),还是与第三方应用共享的数据进行交互,掌握 ContentResolver 的使用都是至关重要的。同时,要注意处理好权限问题,以保证应用的安全性和隐私保护。

系统中很多的设置项如Settings.System.putInt的调用,是对 ContentResolver的封装使用

Settings.System.putInt (getContentResolver(),

"powersaving_on", 1);

具体可查看参考资料

参考资料:

Android系统 Settings数据库读写操作和数据监听变化原理分析_settings.global 监听-CSDN博客

https://juejin.cn/post/7371745917495525402

相关推荐
程序员陆业聪2 分钟前
别再说 Flutter 是唯一选择了——KMP 正在悄悄抢走它的地盘
android
三少爷的鞋31 分钟前
2026 已过 1/3:事豫则立,不预则废——关于架构、协程与边界的思考
android
冬奇Lab39 分钟前
Android 15 音频子系统(八):Audio HAL 与硬件接口——音频数据的最后一公里
android·音视频开发·源码阅读
黄林晴4 小时前
Compose Multiplatform 1.10 发布:里程碑式更新!
android
流星白龙4 小时前
【MySQL】19.MySQL用户管理
android·mysql·adb
匆忙拥挤repeat4 小时前
Android Compose 可组合项的生命周期、副作用API
android
hnlgzb5 小时前
目前编写安卓app的话有哪几种设计模式?
android·设计模式·kotlin·android jetpack·compose
studyForMokey6 小时前
【Android面试】Fragment生命周期专题
android·microsoft·面试
Android系统攻城狮7 小时前
Android tinyalsa深度解析之pcm_plugin_open调用流程与实战(一百七十四)
android·pcm·tinyalsa·音频进阶手册
用户622386252178 小时前
Android 列表控件实战:从 ListView 到 RecyclerView,仿今日头条 HeadLine 项目全解析
android