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 後。 )

從提供程序檢索數據


查詢

在單獨線程上異步執行查詢,涉及到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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章