内容解析器 ContentResolver

来源:互联网 发布:淘宝店芥末和小镇姗姗 编辑:程序博客网 时间:2024/06/09 18:00

注:本文主要摘自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 resultsmCursor = 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进行判断,

// 有时候会抛出异常或者是错误的cursorif (null == mCursor) {    /*     * null的情况是错误的cursor 可能是错误的provider,所以此处最好是log.e     * 或者进行一些处理,但是一定不要继续调用mCursor,否则报错。     */} else if (mCursor.getCount() < 1) {    /*     * 这里可能原因是查询不到数据,可能是相关数据库里面没有,或者搜索词错误。
     */} else {    // 查询成功}

②插入、删除、更新

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

ContentValues mNewValues = new ContentValues();//然后把数据一一putmNewValues.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类(有需要的可以自行了解)


阅读全文
0 0
原创粉丝点击