欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

内容解析器 ContentResolver

程序员文章站 2024-02-09 18:05:48
...

注:本文主要摘自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 末尾来访问表中的单个行。例如,要从用户字典中检索_ID4的行,则可使用此内容 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类(有需要的可以自行了解)