Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> android Content Provider詳解三

android Content Provider詳解三

編輯:Android開發實例

Content Provider 的權限

一個具有provider的應用可以指定其它要操作自己的數據所應具有的權限.這些權限保證了用戶能了解一個應用將要操作那個數據.其它應用需基於provider的需求請求相應的權限.用戶在安裝應用時會看到它們所請求的權限.

如果一個provider的應用沒有指定任務權限,那麼其它應用就不能操作provider的數據.然而,provider所在的應用的組件們卻具有完整的讀寫權限,而不管是否指定了權限.

如上面所提到的,用戶詞典Provider需要android.permission.READ_USER_DICTIONARY 權限來從它取得數據.Provider具有另一個android.permission.WRITE_USER_DICTIONARY權限,代表了插入,更新或刪除的權限.

要獲取操作一個provider的權限,應用需在自己的manifest文件中使用<uses-permission> 元素.當Android包管理器安裝這個應用時,用必須批准所有的權限請求.如果用戶批准了所有的權限請求,包管理器會繼續安裝這個應用;如果沒有,包管理器就會取消安裝過程.

下面的<uses-permission> 元素請求對用戶詞典的讀權限:

    <uses-permission android:name="android.permission.READ_USER_DICTIONARY">

Provider操作權限的作用在指南安全和權限一節中有詳細的描述.


 

插入更新刪除數據

 

用從provider取得數據相同的方法,你也可以讓provider 客戶端與provider的ContentProvider以交互方式修改數據.你調用個ContentResolver 的方法,其參數是要傳給 ContentProvider對應方法的.Provider與provider客戶端自動處理安全問題和進程間通信問題.

插入數據

 

要向一個provider中插入數據,需調用ContentResolver.insert() 方法.此方法插入一個新行到provider中並且返回一個代表這一行的content URI.下面的代碼片段演示了如何將一個新行插入到用戶詞典中:

// 定義一個新的Uri對象,用於接收插入後的返回值
Uri mNewUri;

...

// 定義一個對象來包含要插入的值們
ContentValues mNewValues = new ContentValues();

/*
 * 設置要插入行的每列的值."put"方法的參數是"column name"和"value"
 */
mNewValues.put(UserDictionary.Words.APP_ID, "example.user");
mNewValues.put(UserDictionary.Words.LOCALE, "en_US");
mNewValues.put(UserDictionary.Words.WORD, "insert");
mNewValues.put(UserDictionary.Words.FREQUENCY, "100");

mNewUri = getContentResolver().insert(
    UserDictionary.Word.CONTENT_URI,   // 用戶詞典的content URI
    mNewValues                          // 要插入的值們
);

新行的數據被置入一個ContentValues 對象,就像構建一個單行cursor.對象中的列們不必都是相同的數據類型,並且如果你不想指定某列的值,你可以設置一個列為null ,使用ContentValues.putNull().

此代碼片段中沒有添加_ID 列,因為此列是被自動維護的.Provider會為每個添加的新行分配一個唯一的_ID 值.Provider總是把它用作表的主鍵.

返回的content URI newUri 代表了新添加的行,以下面的形式:

content://user_dictionary/words/<id_value>

<id_value> 是新行的 _ID 的值.大多數可以自動檢測content URI 的格式然後執行對此行的請求的操作.

要從返回的Uri,獲得_ID 的值,調用ContentUris.parseId().

更新數據

 

要更新一行,你可以使用一個ContentValues 對象,向它填充要更新的值,就像你插入時做的,並且選擇條件跟查詢時是一樣的.你應使用的客戶端方法是ContentResolver.update().你只需把要更新的列的值添加到ContentValues 對象.如果你想去清空一列的內容,設置其值為null.

下面的片段改變所有語言列中帶有"en"的行,把其locale置為null.返回值表明了多少行被更新:

// 定義一個對象包含要更新的數據
ContentValues mUpdateValues = new ContentValues();

// 為要更新的行們定義選擇條款
String mSelectionClause = UserDictionary.Words.LOCALE +  "LIKE ?";
String[] mSelectionArgs = {"en_%"};

// 定義一個變量存放更新的行的數量.
int mRowsUpdated = 0;

...

/*
 * 設置更新的值並且更新選擇的單詞
 */
mUpdateValues.putNull(UserDictionary.Words.LOCALE);

mRowsUpdated = getContentResolver().update(
    UserDictionary.Words.CONTENT_URI,   // the user dictionary content URI
    mUpdateValues                       // the columns to update
    mSelectionClause                    // the column to select on
    mSelectionArgs                      // the value to compare to
);

刪除數據

 

刪除行與獲取行的方式相似:你為想要更新的行指定選擇條款,然後客戶端方法就會返回被刪除的行數.下面的代碼片段刪除那些appid等於"user"的行們.返回被刪除的行數.


// 定義要刪除的行們的選擇條款
String mSelectionClause = UserDictionary.Words.APP_ID + " LIKE ?";
String[] mSelectionArgs = {"user"};

// 定義一個存放刪除的行數的變量
int mRowsDeleted = 0;

...

// 刪除那些符合選擇條款的單詞們
mRowsDeleted = getContentResolver().delete(
    UserDictionary.Words.CONTENT_URI,   // the user dictionary content URI
    mSelectionClause                    // the column to select on
    mSelectionArgs                      // the value to compare to
);

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved