Android 学习记录-contentProvider

内容提供程序

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

提供程序的应用使用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 等方法

内容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 后。 )

从提供程序检索数据

Android 学习记录-contentProvider_第1张图片

在单独线程上异步执行查询,涉及到CursorLoader类与加载器。

基本查询步骤

  1. 请求提供程序的权限
  2. 定义查询代码,并发送到提供程序。

请求权限

要想你的程序可以从提供者的程序搜索数据,你需要在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);

你可能感兴趣的:(android,数据,通信,对象,应用)