編輯:Android開發實例
一個具有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
);
可以顯示在的Android任務,通過加載進度條的進展。進度條有兩種形狀。加載欄和加載微調(spinner)。在本章中,我們將討論微調(spinner)。Spinner 用
上一節中講了App->Activity->Custom Title
相關文章android popwindow實現左側彈出菜單層http://www.jb51.net/article/33533.htm移動App設計的13大精髓h
寫這篇文章,做份備忘,簡單滴展示一個帶進度條的Webview示例,進度條位於Webview上面. 示例圖如下: 主Activity代碼: 代碼如下: packa