天天看點

《Android開發進階:從小工到專家》——第1章,第1.4節ContentProvider(外共享資料)

本節書摘來自異步社群《android開發進階:從小工到專家》一書中的第1章,第1.4節contentprovider(外共享資料),作者 何紅輝,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

1.4 contentprovider(外共享資料)

contentprovider在android中的作用是對外共享資料,也就是說可以通過contentprovider把應用中的資料共享給其他應用通路,其他應用可以通過contentprovider對應用中的資料進行添、删、改、查。使用contentprovider對外共享資料的好處是,統一了資料的通路方式,它實際上是對sqliteopenhelper的進一步封裝,通過uri映射來判斷選擇需要操作資料庫中的哪個表,并且進行增、删、改、查處理。

首先我們先來學習uri,uri代表了要操作的資料表的絕對路徑,uri主要包含了兩部分資訊,一是需要操作的contentprovider,二是對contentprovider中的哪個表進行操作。對于contentprovider來說,一個uri由以下幾部分組成,如圖1-18所示。

《Android開發進階:從小工到專家》——第1章,第1.4節ContentProvider(外共享資料)

contentprovider的scheme已經由android固定設定為content://,authority用于唯一辨別這個contentprovider,外部調用者可以根據這個辨別來找到它。這裡的path就是要操作的資料庫表,最後的id關鍵字是可選字段,例如,我們要操作特定的資料項時就會指定一個查詢條件,如所有聯系人的uri:content://contacts/people,某個聯系人的uri: content://contacts/people/5,這個5就是聯系人的id,也就對應了這裡的查詢關鍵字。

如果要把一個字元串轉換成uri,可以使用uri類中的parse()函數,如下:

uri uri = uri.parse("content://contacts /people");

android系統根據uri來定位注冊到系統的contentprovider中,找到contentprovider之後會通過contentresolver來操作對應的資料庫。實作contentprovider的第一步就是需要覆寫contentprovider的insert、query、upate、delete、gettype函數。下面我們要建立一個contentprovider,該contentprovider存儲了一些服務行業人員的電話資訊,如一些系統中就存儲了快遞人員、肯德基訂餐電話等資訊。我們要做的就是實作類似的功能,首先定義一個contentprovider,代碼如下:

我們需要在contentprovider中根據uri建立關系映射,通過urimatcher管理不同uri對應的type類型,這個類型會在gettype中被傳回。當在contentprovider中進行增、删、改、查操作時,就會根據這個類型選擇對應的資料表。在這個例子中,我們通過urimatcher映射了4種uri類型, uri 的格式主要有兩種,以表名結尾就表示期望通路該表中所有的資料,以id結尾就表示期望通路該表中擁有相應 id 的資料。我們可以使用通配符的方式來分别比對這兩種格式的内容uri,“*”表示比對任意長度的任意字元,“#”表示比對任意長度的數字。是以,content://com.book.jtm.info /userinfo表示要查詢userinfo表中的所有資料,而content://com.book.jtm.info /userinfo/#表示要根據一個數字id查詢一個使用者。

下面我們就完成資料庫操作的相關代碼:

// 删除、更新的代碼省略

上述代碼中,我們把傳遞進來的uri通過urimatcher進行解析,得到type之後,再根據type來判斷要操作哪個表,根據它的資料類型是所有資料還是單個資料,然後執行對應的資料庫操作。對資料庫的操作通過userinfodbhelper類實作。代碼如下:

在userinfodbhelper中我們建立了兩個表,分别為userinfo和company,表結構表1-2和表1-3所示。

《Android開發進階:從小工到專家》——第1章,第1.4節ContentProvider(外共享資料)

完成contentprovider代碼之後,第二步需要在androidmanifest.xml中使用對該contentprovider進行配置,為了能讓其他應用找到該contentprovider ,contentprovider采用了authorities對它進行唯一辨別,示例如下:

此時,我們就可以使用該contentprovider了。

我們建立一個provideractivity,在該activity中存儲、查詢使用者資訊,代碼如下所示:

上述activity中我們可以将使用者資訊和公司資訊根據不同的uri插入到同一個contentprovider中,userinfoprovider會根據uri選擇對應的表進行插入,查詢也是同樣的道理。首先我們插入一條使用者資料,該使用者的電話為123456,描述為順風快遞員吳老二,公司id為11,插入之後我們可通過電話号碼123456到contentprovider中查詢該使用者的資訊,此時就會得到該使用者的描述資訊,如圖1-19所示。

《Android開發進階:從小工到專家》——第1章,第1.4節ContentProvider(外共享資料)

然後我們再插入該公司的資訊,此時該conentprovider的資料庫中就有了資料,我們将資料庫導出到pc中,結果如圖1-20和圖1-21所示。

《Android開發進階:從小工到專家》——第1章,第1.4節ContentProvider(外共享資料)

正如本章前文所說,contentprovider不過是對sqliteopenhelper的二次封裝,通過urimatcher将資料庫中的表與uri建立關聯,當使用者通過uri操作contentprovider時,contentprovider會根據uri選擇對應的資料庫表進行增、删、改、查操作。通過contentprovider機制,使得資料可以在各應用之間共享,并且為使用者提供了統一的api接口,降低了使用者的使用成本。