内容提供程序管理对数据的访问,方便供其它应用来访问自己的数据。
提供程序的应用使用ContentProvider,客户端应用使用ContentResolver,这两个对象可自动处理跨进程通信。(注:要想访问提供程序,你的应用需要在清单文件中请求特定权限)
查询 query( Uri , projection , selection , selectionArgs , sortOrder )
query() 参数 | SELECT 关键字/参数 | 备注 |
---|---|---|
Uri | FROM table_name | Uri 映射至名为 table_name 的提供程序中的表。 |
projection | col,col,col,… | projection 是应该为检索到的每个行包含的列的数组。 |
selection | WHERE col = value | selection 会指定选择行的条件。 |
selectionArgs | (没有完全等效项。选择参数会替换选择子句中 ? 的占位符。) | |
sortOrder | ORDER BY col,col,… | sortOrder 指定行在返回的 Cursor 中的显示顺序 |
还有
insert ,update,delete 等方法
Uniform Resource Identifier
资源定位符,包含整个提供程序的符号名称和指向表的路径。
比如 content://user_dictionary/words
其中,user_dictionary 字符串是提供程序的授权, words 字符串是表的路径。字符串 content:// 一般以这个开头。
Uri singleUri = ContentUris.withAppendedId(UserDictionary.Words.CONTENT_URI,4);
将_ID值追加到URI末尾来访问特定的单个行。
(注:Uri 和 Uri.Builder 类 有根据字符串构建格式规范的 URI 对(前面请求天气的httpURI)。 ContentUris 包含一些可以将 ID 值轻松追加到 URI 后的方法。前面的代码段就是使用 withAppendedId() 将 ID 追加到用户字典内容 URI 后。 )
在单独线程上异步执行查询,涉及到CursorLoader类与加载器。
基本查询步骤
要想你的程序可以从提供者的程序搜索数据,你需要在manifest里面申请对目标的使用权限。
例如USER_DICTIONARY,你需要申请
<uses-permission android:name="android.permission.READ_USER_DICTIONARY"/>
//表的名字路径
Uri uri = UserDictionary.Words.CONTENT_URI;
//这个数组里面是你想要返回的列
String[] mProjection =
{
UserDictionary.Words._ID,
UserDictionary.Words.WORD,
UserDictionary.Words.FREQUENCY
// 如果用户输入额外条件,这个做出相应变化
// 比如mSelectionClause = UserDictionary.Words.WORD + " = ?";
String mSelectionClause = null;
//代替 前面的那个 "?"
String[] mSelectionArgs = {""};
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(uri,
mProjection,
mSelectionClause,
mSelectionArgs,
UserDictionary.Words.FREQUENCY + " ASC" //返回结果的排序方式
);
类似 SELECT _ID, word, locale FROM words WHERE word = 用户输入 ORDER BY FREQUENCY ASC;
返回数据的游标,可以通过它遍历数据。
常用方法:
getCount();
moveToNext();
比如:
while(cursor.moveToNext()){ // do something here}
getInt(column 下标);
getString(column 下标)
int columIndex = cursor.getColumnIndex(String name);
String name = cursor.getString(columIndex);
最后用完需要把cursor关闭,防止内存crash,调用 cursor.close();
查询会返回一个cursor,利用SimpleCursorAdapter类,连接到listView
// 想要显示的列
String[] mWordListColumns =
{
UserDictionary.Words.WORD,
UserDictionary.Words.LOCALE
};
// 每一列对应的listView的ID
int[] mWordListItems = { R.id.dictWord, R.id.locale};
// 游标适配器,绑定到listview
mCursorAdapter = new SimpleCursorAdapter(
getApplicationContext(), // 应用的content
R.layout.wordlistrow, // listview的布局
mCursor, // 查询的结果
mWordListColumns, // 显示的列
mWordListItems, // 对应的listview id
0); // Flags (usually none are needed)
// 把适配器应用到listView
mWordList.setAdapter(mCursorAdapter);