android Content Provider詳解一

來源:互聯網
上載者:User

Content providers管理對結構化資料集的使用.它們封裝資料,並提供了資料安全的機制.Content providers是從一個進程串連另一個進程中的資料的標準介面.

當你想使用一個content provider中的資料,你需在你的應用的Context 中使用ContentResolver對象作為用戶端與provider 進行通訊.ContentResolver對象與provider對象通訊,provider是實現ContentProvider的類.Provider對象接收用戶端發來的請求,執行請求的動作,返回結果.

如果你不想把你的資料共用給其它應用,你不需開發你自己的provider.然而,你需要自己的provider來在你的應用中提供自訂搜尋建議.如果你需要從你的應用中考貝複雜的資料或檔案粘貼到其它應用中,你也需要提供自己的provider.

Android自己包含了管理音頻,視頻,映像,個人通訊錄等資料的content providers.你可以從android.provider 包的參考文檔中爪到它們.這些providers 可以被所有的android應用使用,但可能帶有一些限制.

Content Provider 基礎
一個content provider 管理對中央資料倉儲的使用.一個provider是一個Android應用的一部分,應用一般提供它自己的UI來操作資料.然而,content providers主要是為了給其它應用使用,其它的應用使用provider用戶端對象來操作provider.providers 和provider用戶端一起提供了一致的,標準的介面來操作用於進程間通訊的資料並保處資料的安全性.

本節講解以下基礎知識:

· content providers如何工作.

· 從content provider取得資料的API.

· 向content provider插入,更新以及刪除資料的API.

· 其它有助於使用providers的API.

概述
一個content provider代表了面向外部應用的資料,這些資料看起來就像關係型資料庫中的一個或多個table.一行代表某種資料類型的一個執行個體,一列代表這個執行個體的一個屬性或欄位.

舉個例子,Android平台中的一個內建的provider是使用者字典,它儲存了使用者想儲存的非標準詞的拼字.表1 示範了資料在provider的表中可能看起來的樣子:

Table 1: 簡單使用者字典表

word
 app id
 frequency
 locale
 _ID
 
mapreduce
 user1
 100
 en_US
 1
 
precompiler
 user14
 200
 fr_FR
 2
 
applet
 user2
 225
 fr_CA
 3
 
const
 user1
 255
 pt_BR
 4
 
int
 user5
 100
 en_UK
 5
 

在上表中,每行代表了一個不能在標準字典中找到的詞.每一列代表了這個詞了一個屬性.列頭是儲存在provider中的列的名字.要引用一行的locale屬性,需引用locale 列.對於這個provider,_ID列作為"主鍵"列,provider會自動管理它.

註:一個provider不是必須具備主鍵的,並且也不是必須使用_ID 作為主鍵的列名來引用一行.然而,如果你把一個provider綁定到一個ListView,就必須有一個列名叫做_ID.此需求將在顯示查詢結果一節中有詳細的解釋.

操作一個provider
應用使用ContentResolver用戶端對象來操作content provider中的資料.此對象具有一些與provider 對象中同名的方法,provider對象指的是某個ContentProvider具體衍生類別的執行個體.ContentResolver 的方法們提供了對儲存資料的基本的"CRUD" (增刪改查)功能.

ContentResolver 對象處於用戶端應用的線程中,ContentProvider 對象位於另外的進程並且自動處理進程間通訊. ContentProvider 也代表了資料層與可視層之間的一個抽象層.

註:要使用一個provider,你的應用通常需要在manifest請求一些許可權, 這將在Content Provider 許可權一節中進行更詳細的講解.

舉個例子,要從使用者字典Provider中擷取取單詞和它們的locale列表,你需調用ContentResolver.query().query() 方法會調用使用者字典中的ContentProvider.query() 方法.下面的代碼示範了ContentResolver.query() 調用:

// 查詢使用者字典並返回結果
mCursor = getContentResolver().query(
    UserDictionary.Words.CONTENT_URI,   // 單詞表的content URI
    mProjection,                        // 每行要返回的列們
    mSelectionClause                    // Selection的條件
    mSelectionArgs,                     // Selection的條件
    mSortOrder);                        // 返回各行要如何排序

表2展示了query(Uri,projection,selection,selectionArgs,sortOrder) 的參數們如何與一個SQL SELECT語句匹配:

Table 2: Query() 與SQL 查詢的對比

query() argument
 SELECT keyword/parameter
 Notes
 
Uri
 FROM table_name
 Uri 對應provider 中叫做table_name的表.
 
projection
 col,col,col,...
 projection 是每行要包含的列們
 
selection
 WHERE col = value
 selection 指定了一些選擇條件
 
selectionArgs
 (不能對應.替換selection參數各類似於? 的預留位置)
 
sortOrder
 ORDER BY col,col,...
 sortOrder 指定排序方式
 

 

Content URIs
content URI 是一個標誌provider中的資料的URI.Content URI中包含了整個provider的以符號表示的名字(它的authority) 和指向一個表的名字(一個路徑).當你調用一個用戶端的方法來操作一個provider中的一個表,指向表的content URI是參數之一.

常量CONTENT_URI 中包含了使用者字典table的content URI.ContentResolver 對象分析出URI的authority,並使用它與一個已知provider組成的系統資料表中的authority進行對比來"解決"provider.ContentResolver之後就會派送查詢參數給正確的 provider.

ContentProvider使要長content URI的路徑辨別分來選擇要操作的表.通常一個provider中要暴露的每個表都具有一個路徑.

在上面的例子的代碼中,"詞典"表的全URI是:

content://user_dictionary/words

user_dictionary部分是provider的 authority,words部分是表的路徑.字串 content:// (the scheme) 總是要存在,它表示引用一個content URI.

很多provider允許你通過在URI的末尾增加一個ID來動作表中一個單獨的行.例如,要從使用者字典中擷取_ID是4的一行,你可要行使用這樣的content URI:www.2cto.com

Uri singleUri = ContentUri.withAppendedId(UserDictionary.Words.CONTENT_URI,4);

當你要擷取多行然後更新或刪除其中一時,你經常要使用的是id值.

註:Uri和Uri.Builder類包含由字串構建格式正確的Uri對象的簡便的方法們.ContentUris 包含向一個URI添加id值的簡便方法們.上面的小程式碼片段就是使用了withAppendedId() 來向UserDictionary content URI添加id.

 


作者:nkmnkm

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.