讀古今文學網 > Android程序設計:第2版 > 第12章 使用內容提供者 >

第12章 使用內容提供者

在Android應用間共享數據時,位於應用的數據庫內部的數據需要依靠內容提供者API才能被從外部訪問。例如,Android聯繫人內容提供者對於可以重用在Android平台上的持久存儲的聯繫人信息的應用的數量不設上限。只需簡單地調用這個內容提供者,應用就可以訪問存儲在本地的用戶聯繫方式,並能和Google的雲存儲同步。應用不需要提供其數據庫操作代碼就可以讀寫內容提供者中的數據。通過這種方式,內容提供者提供了強大的功能,它使得開發人員很容易創建具有複雜的數據管理功能的應用——在很多情況下,應用本身只需要編寫很少的數據持久性代碼。

內容提供者API支持客戶端上的應用使用統一資源定位符(URI)查詢OS以獲取相關數據,這和瀏覽器從互聯網請求信息類似。對於給定的URI查詢,客戶端並不清楚哪個應用會提供數據;它只是通過URI向操作系統發出請求,由Android平台負責啟動合適的應用以提供查詢結果。Android平台還支持客戶端對內容提供者數據訪問權限進行限制。

內容提供者API支持對共享內容的完整操作權限,具體包括:創建、讀取、更新和刪除。這意味著應用可以使用面向URI的請求來使用這些API:

·創建新的記錄

·檢索一條、所有或一些記錄

·更新記錄

·刪除記錄

本章將通過介紹一個名為SimpleFinchVideoContentProvider的示例內容提供者的內部工作機制來說明如何編寫自己的內容提供者。SimpleFinchVideoContentProvider的實現在Finch源代碼樹中。所有相關的文件都在本章的源代碼目錄中。本節中要用到的AndroidManifest.xml文件的引用是$(FinchVideo)/AndroidManifest.xml。我們會實現主體的ContentProvider類所需要的每個方法,並通過這些實現代碼來介紹如何創建一個內容提供者。還將解釋如何把SQLite數據庫集成到內容提供者中。本節也會描述如何實現內容提供者的基礎功能,這些基礎功能在數據和數據庫記錄的URI之間建立起了一個映射關係。你將看到,內容提供者是如何封裝數據持久性功能的,當你在文件AndroidManifest.xml中聲明了內容提供者時,最終其內部是如何實現對進程間共享數據功能的支持的。還將說明如何把內容提供者數據掛接到Android UI組件中,從而完成本書提到的MVC架構。最後,將構建查看數據的活動,它會隨著數據而變化,自動刷新顯示的內容。

注意:在本章中,假定本地內容提供者存儲使用的是SQLite數據庫。給定內容提供者的API方法query、insert、update和delete,但仍然需要費一番思量來考慮如何將這些方法映射到其他方法。雖然理論上這些API背後的存儲和檢索可以使用任何方式,例如可以使用一個普通的文件來支持所需要的操作,但這種方式實在不夠理想。

下一章將說明如何擴展和增強內容提供者的概念。其中,你將瞭解如何充分利用內容提供者API來把RESTful網絡服務集成到Android中。雖然這種簡單的架構只是依賴於基礎的Android組件,但是它可以避免很多常見的移動編程錯誤。你會發現這種方法所形成的結構在邏輯上顯著增強了Android應用的穩定性,同時還提高了性能。

我們將完整說明一個視頻列表應用,這個應用簡單說明了這種架構。該應用遵循了推薦的處理模式:先加載,然後解析,最後緩存來自http://gdata.youtube.com的RESTful Web服務中的YouTube視頻內容。將使用gData作為RESTful服務例子,並將該服務集成到Android內容提供者中。應用的UI將使用內容提供者動態地顯示從網絡上獲取到的視頻條目。可以應用這種方法,把互聯網上的大量的web服務集成到基於Android的應用中。順便提一下,gData URI提供了很整潔的demo程序,值得下一看。