讀古今文學網 > Android程序設計:第2版 > 編寫並集成內容提供者 >

編寫並集成內容提供者

前面探討了簡單視頻列表應用的總體結構,為客戶端提供了訪問內容提供者的方式,現在一起來看看在應用中如何使用SimpleFinchVideoContentProvider。

常見的內容提供者任務

在後面各節中,首先提供一份編寫內容提供者的高級指南,然後介紹Android MVC,最後詳細解釋SimpleFinchVideoContentProvider的實現代碼。

擴展ContentProvider

應用擴展ContentProvider類以處理特定數據類型的URI,如MMS消息、圖片和視頻等。例如,對於處理視頻的內容提供者,ContentProvider.insert方法會把視頻的描述數據插入到SQLite表中,每個字段表示特定的信息,如標題、描述等信息。

可以從下面兩個方法的實現入手,開始編寫自己的內容提供者。

onCreate

該方法提供hook,支持內容提供者執行初始化。任何只想執行一遍的代碼,如連接數據庫,都應該在onCreate方法中實現。

String getType(Uri uri)

該方法從給定的URI中提取出內容提供者集成在URI中的MIME類型。URI來源於對數據訪問感興趣的客戶端應用。

可以重寫主內容提供者的數據訪問方法:

insert(Uri uri,ContentValues values)

當客戶端需要把數據插入到內容提供者的數據庫時,會調用insert方法。通常情況下,該方法的實現就是直接或間接地觸發數據庫的插入操作。

cursor query(Uri uri,Stringprojection,String selection,StringselectionArgs,String sortOrder)

當客戶端想要從內容提供者的數據庫中讀取數據時,會調用query方法。一般而言,使用SQL SELECT語句檢索數據,返回包含該請求的數據的cursor。開發人員使用Activity的managedQuery方法間接調用這個方法,或把該方法的返回值傳遞給startManagingQuery方法並調用。如果活動無法「托管」返回的游標,或關閉游標失敗,應用會出現嚴重的內存洩露,可能會導致應用的性能變差甚至崩潰。

update(Uri uri,ContentValues values,String selection,StringselectionArgs)

當客戶端想要更新內容提供者數據庫的一條或多條記錄時,會調用這個方法。該update方法會被翻譯成SQL的UPDATE語句執行。

delete(Uri uri,String selection,StringselectionArgs)

當客戶端想要刪除內容提供者數據庫中的一條或多條記錄時,會調用delete方法。該方法會被翻譯成SQL的DELETE語句被執行。

這4個方法都在給定的URI參數所對應的數據上執行操作。每種方法的經典實現都是從把輸入的URI參數和特定的數據類型進行匹配開始的。例如,內容提供者的實現需要弄清給定的URI是否指向某個專門的視頻,或者一組視頻。當內容提供者和URI匹配後,就會執行相應的SQL操作。然後,每個方法會返回一個值或者引用的數據,描述受影響的數據,或者返回被操作影響到的元素數量。例如,如果給定的URI指向的是本地表中的某個元素,則這個視頻查詢就會返回一個先標,其中包含一個視頻元素。

把URI和表中的數據進行匹配是內容提供者工作的一部分。雖然你可能覺得自己解析內容提供者URI也不是很困難,但Android提供了良好的工具來執行這個操作,這個工具使用起來很方便,而且更重要的是,它可以幫助開發人員對提供者URI的格式進行標準化。URIMatcher類支持把包含authority、path和ID字符串的URI映射到應用定義的常量,可以使用case語句處理特定類型的URI。這裡,提供者可以決定應該使用什麼樣的SQL操作來管理真正的表記錄。傳統的內容提供者會創建URIMatcher的靜態實例,使用靜態初始化程序對它執行實例化,這個靜態初始化程序會調用URI的Matcher.addURI方法建立在後面的內容提供者數據方法中會使用的一級映射。在P335「SimpleFinch VideoContent Provider類和實例變量」一節給出的視頻內容提供者就是這樣實現的。