讀古今文學網 > Android程序設計:第2版 > 理解內容提供者 >

理解內容提供者

內容提供者對數據管理進行封裝,因而應用的其他部分,如視圖和控制器不需要參與數據的持久化。換句話說,內容提供者對應用數據的持久化是因為視圖和控制器本身也不應該處理它。設計優良的代碼都是通過專門的軟件層處理專門任務,而不會處理其他層的任務。當軟件層執行其範疇外的任務時,就會引發bug和不必要的複雜性。因此,UI應該只包含佈局良好的UI組件,負責從終端收集事件。精心編寫的應用控制器只包含移動應用的域邏輯。在本章,當代碼可以把數據持久性委託給第三方即內容提供者時,代碼就顯得簡潔。回顧P260「Android應用中的SQL和數據庫為中心的數據模型」一節,內容提供者非常適合實現不以文檔為中心的數據模型。

有了內容提供者,應用不需要自己打開SQLite表,因為這些細節會在內容提供者的內部實現。在過去,為了共享數據,移動應用可能需要以配置的形式把它保存在本地文件系統的文件中。在Android中,應用往往可以依賴內容提供者來搞定存儲。

在深入探討SimpleFinchVideoContentProvider之前,將先對Finch視頻應用進行簡單介紹,以便讓讀者瞭解內容提供者是實現任務的背景。

實現內容提供者

要充分發揮這種設計結構的優勢,需要實現自己的內容提供者,而且需要完成以下任務:

1.為客戶端創建內容提供者的公共API:

a.為內容提供者定義CONTENT_URI

b.創建字段名稱,用於和客戶端通信

c.聲明public static String對象,客戶端用它來指定字段

d.為新數據類型定義MIME類型

2.實現自己的內容提供者,需要完成以下任務:

a.擴展主內容提供者API,即ContentProvider類,創建定制的內容提供者

b.設置提供者URI

c.創建SQLite數據庫和關聯的游標來存儲內容提供者的數據

d.使用游標使得客戶端可以使用這些數據,並支持動態數據更新

e.定義二進制數據返回到客戶端的過程

f.實現Cursor給客戶端返回數據的方法query、insert、update和delete

3.更新AndroidManifest.xml文件,聲明自己的<provider>。

當完成基礎的內容提供者實現後,將對使用內容提供者的任務進行介紹,從而開發更高級的網絡架構。

通過Finch瀏覽視頻

Finch視頻查看器使用戶可以列出和視頻相關的元數據。我們將探討兩個版本的視頻列表應用及其底層的兩個內容提供者。第一個版本是個簡單的視頻列表應用,它使用了SimpleFinchVideoContentProvider,目的是為了演示如何實現一個自己的內容提供者。該應用的第二個版本將在下一章介紹,它是一個相對稍複雜一些的內容提供者,其增加了從在線的YouTube視頻搜索服務中獲取數據內容的功能。第二個版本具有緩存結果並顯示視頻縮略圖的功能。

現在,探討第一個版本。這個簡單的應用包含一個活動:SimpleFinchVideoActivity,它支持用戶創建並列出自己的視頻元數據(如視頻標題、描述、URI和ID),如圖12-1所示。

圖12-1:簡單的視頻內容提供者,它支持用戶輸入自己的視頻「元數據」

要使用該應用,只需要為video項輸入合適的數據,然後按下Insert按鈕。文本字段下方的列表就會由Android MVC機制自動刷新數據視圖。

簡單的視頻數據庫

為了保存用戶通過應用輸入的數據,SimpleFinchVideoContentProvider類使用下面這條SQL語句創建了自己的數據庫:


CREATE TABLE video (_id INTEGER PRIMARY KEY, title TEXT, decription TEXT, uri TEXT);
  

在Android游標系統中,要求使用_id字段。_id字段唯一標識cursor中的一條記錄以及數據庫中的一個對象。因此,需要通過SQL屬性INTEGER PRIMARY KEY AUTOINCREMENT定義該字段,確保它的值是唯一的。

title和description字段分別用來保存視頻的標題和描述數據。uri字段保存媒體URI,通過該URI可以在實際的應用中播放視頻。

簡單版的代碼結構

本節將簡要介紹簡單的Finch視頻應用的相關文件。

AndroidManifest.xml

我們為這個視頻內容提供者創建了清單文件,它包含SimpleFinchVideoActivity的引用及內容提供者SimpleFinchVideoContentProvider。

$(FinchVideo)/src/com/oreilly/demo/pa/finchvideo/FinchVideo.java

FinchVideo類包含AUTHORITY屬性(將在後面討論它)及SimpleVideo類,它定義了內容提供者字段的名稱。FinchVideo類和SimpleVideo類都不包含任何可執行的代碼。

$(FinchVideo)/src/com/oreilly/demo/pa/finchvideo/provider/SimpleFinchVideoContent-Provider.java

該SimpleFinchVideoContentProvider類是簡單視頻數據庫的內容提供者,它處理視頻應用的URI請求。本節前半部分要探討的主要就是這個文件。

$(FinchVideo)/src/com/oreilly/demo/pa/finchvideo/SimpleFinchVideoActivity.java

SimpleFinchVideoActivity類是支持用戶查看視頻列表的活動。