您的位置:首页 > 移动开发 > Android开发

Android 学习记录-contentProvider

2016-05-04 15:58 573 查看

内容提供程序

内容提供程序管理对数据的访问,方便供其它应用来访问自己的数据。

提供程序的应用使用ContentProvider,客户端应用使用ContentResolver,这两个对象可自动处理跨进程通信。(注:要想访问提供程序,你的应用需要在清单文件中请求特定权限)

查询 query( Uri , projection , selection , selectionArgs , sortOrder )

query() 参数SELECT 关键字/参数备注
UriFROM table_nameUri 映射至名为 table_name 的提供程序中的表。
projectioncol,col,col,…projection 是应该为检索到的每个行包含的列的数组。
selectionWHERE col = valueselection 会指定选择行的条件。
selectionArgs(没有完全等效项。选择参数会替换选择子句中 ? 的占位符。)
sortOrderORDER BY col,col,…sortOrder 指定行在返回的 Cursor 中的显示顺序
还有

insert ,update,delete 等方法

内容URI

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;

Cursor

返回数据的游标,可以通过它遍历数据。

常用方法:

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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息