内容解析器 ContentResolver

ContentResolver是Android中用于访问内容提供程序的数据接口,它提供了一种标准方式来跨进程安全地读写数据。内容提供者是Android应用的一部分,常用于提供数据的UI,并允许其他应用通过客户端对象进行访问。在使用ContentResolver进行CRUD操作前,需要在manifest文件中声明相应的权限。例如,访问用户字典需要`<uses-permission android:name="android.permission.READ_USER_DICTIONARY">`。查询数据时,应确保对Cursor进行判断。ContentResolver还支持异步查询,如使用CursorLoader进行数据加载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注:本文主要摘自developer.android.google.cn/(现在开发者文档里面大多数都有中文版,而且不需要翻墙)

如果有哪里错误,请务必指出,谢谢!


内容提供程序管理对中央数据存储区的访问。提供程序是 Android 应用的一部分,通常提供自己的 UI 来使用数据。 但是,内容提供程序主要旨在供其他应用使用,这些应用使用提供程序客户端对象来访问提供程序。 提供程序与提供程序客户端共同提供一致的标准数据界面,该界面还可处理跨进程通信并保护数据访问的安全性。

内容提供器CRUD跟检索行数据(比如数据库存储方法Sqlite)相类似,所以不了解的可以先了解Sqlite。


第一步应该请求权限:

根据需求去manifest中<uses-permission>填写相关的权限

如下文的用户字典就应该申请: <uses-permission android:name="android.permission.READ_USER_DICTIONARY">


①查询用法query大致如下:

// Queries the user dictionary and returns results
mCursor = getContentResolver().query(
    UserDictionary.Words.CONTENT_URI,   // The content URI of the words table
    mProjection,                        // The columns to return for each row
    mSelectionClause                    // Selection criteria
    mSelectionArgs,                     // Selection criteria
    mSortOrder);                        // The sort order for the returned rows
许多提供程序都允许通过将 ID 值追加到 URI 末尾来访问表中的单个行。例如,要从用户字典中检索 _ID 4 的行,则可使用此内容 URI:

Uri singleUri = ContentUris.withAppendedId(UserDictionary.Words.CONTENT_URI,4);
还有一种方法是:

Uri uri = Uri.withAppendedPath(UserDictionary.Words.CONTENT_URI, "4");
本例子URI是用户字典,根据所需替换两个参数, 注意withAppendedId是int,而Path的是String。

查询之后最好对cursor进行判断,

// 有时候会抛出异常或者是错误的cursor
if (null == mCursor) {
    /*
     * null的情况是错误的cursor 可能是错误的provider,所以此处最好是log.e
     * 或者进行一些处理,但是一定不要继续调用mCursor,否则报错。
     */
} else if (mCursor.getCount() < 1) {

    /*
     * 这里可能原因是查询不到数据,可能是相关数据库里面没有,或者搜索词错误。
     */
} else {
    // 查询成功

}

②插入、删除、更新

这几个都跟检索行数据方法差不多就不一一列出了。

ContentValues mNewValues = new ContentValues();
//然后把数据一一put
mNewValues.put(UserDictionary.Words.APP_ID, "example.user");
mNewUri = getContentResolver().insert(UserDictionary.Word.CONTENT_URI,mNewValues);

插入时如果您不想指定值,则可以使用 ContentValues.putNull() 将列设置为 null。代码段不会添加 _ID 列,因为系统会自动维护此列。

更新时如果您要清除列的内容,请将值设置为 null。


实用要点:

联系人提供程序中的 ContactsContract.Data 表会使用 MIME 类型来标记每行中存储的联系人数据类型。 要获取与内容 URI 对应的 MIME 类型,请调用 ContentResolver.getType()。

批量访问:批量访问提供程序适用于插入大量行,或通过同一方法调用在多个表中插入行,或者通常用于跨进程界限将一组操作作为事务处理(原子操作)执行。要在“批量模式”下访问提供程序, 您可以创建 ContentProviderOperation 对象数组,然后使用 ContentResolver.applyBatch() 将其分派给内容提供程序。您需将内容提供程序的授权传递给此方法,而不是特定内容 URI。 这样可使数组中的每个 ContentProviderOperation 对象都能适用于其他表。 调用 ContentResolver.applyBatch() 会返回结果数组。

异步查询:平时在初始化加载数据时候(比如读取联系人信息),实际用途中请使用异步方法,官方推荐的类有CursorLoader类(有需要的可以自行了解)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值