內容提供程序
內容提供程序管理對數據的訪問,方便供其它應用來訪問自己的數據。
提供程序的應用使用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 後。 )
從提供程序檢索數據
在單獨線程上異步執行查詢,涉及到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);