內容提供者的基本知識
這是第一篇關於Android內容提供者教程系列文章,這個教程系列主要包含三篇文章。在這篇文章中將爲你闡述內容提供者一些最基本的概念,這是你使用或者編寫一個內容提供者所必須的知識儲備
什麼是內容提供者?
內容提供者是讓你能訪問其他應用程序數據的Android中央機制 - 在Android平臺上大部分的數據存儲在數據庫或普通的文件中。內容提供者同樣作爲Android中一種中央組件類型用來支持Android模塊化。如果沒有內容提供者用來訪問其他應用程序的數據情況將會變得一團糟。
內容提供者支持四種基本的操作,就是我們熟知的CRUD。對於內容提供者來說CRUD簡單的可以認爲代表數據 - 大多數情況下是數據庫中的一條記錄 - 但是也可能是一張SDCard中的照片或者網絡上的一個視頻
Android本身提供了一些標準的內容提供者,比如獲取聯繫人應用中的聯繫人信息、系統中的視頻,系統中的共享參數等。在第二篇教程中將爲你展示這些內容提供者的使用方法。
在第三篇教程中將爲你介紹自己動手編寫內容提供者一些基本知識。內容提供者使得其它的應用來訪問你的應用中的數據變得更簡單。而且使用內容提供者也讓小部件的開發更加容易。
Content URIs
在處理內容提供者時最需要理解的概念是內容URI。不管在什麼時候,如果你想通過一個內容提供者來獲取數據,你都必須指定一個URI。URI格式通常如下所示
1 |
content://authority/optionalPath/optionalId |
主要包含四部分:scheme(Android已固定爲content),authority(唯一標識一個內容提供者),可選路徑,可選id
內容提供者的scheme已經固定爲content ,"://"是URI-RFC固定的一部分而且用來分隔scheme和authority
authority用來唯一標識一個內容提供者。因而命名規範最好遵循Java中包命名規則。換言之你需要用一個顛倒的域名名字(com.android)再加上一個限定詞來區別每一個你發佈的內容提供者。Android官方文檔建議我們使用自定義的ContentProvider類全名來標識
第三個部分,可選path,是用來區分你的內容提供者提供的是什麼類型的數據。在提供Android媒體庫中數據的內容提供者,比如,爲了區分音頻、視頻文件和圖片文件會使用不同的path。在這種方式下內容提供者能夠支持幾種相關聯的數據類型的訪問。對於完全不相關聯的數據類型你應該使用不同的內容提供者,因此也應該使用不同的authorities
如果存在第四部分 - 可選id,那麼必須是一個數字,這個id是當你想獲得單條數據時來使用
有兩種類型的URIs:目錄URIs和指定了id的URIs。如果一個URI沒有指定id,那麼就是個目錄URI
你可以用目錄URIs去訪問同一種類型的多條數據。CRUD操作一般都是目錄URIs
如果你想訪問一條特定的數據,那麼你就可以用id-based URIs。你不能用id-based URIs來添加數據,但是讀取、更新、刪除可能會用到id-based URIs
在可選path部分我們可以附加一些特定的信息來限制範圍。在媒體庫內容提供者中我們可以用path部分來區分不同的類型。除此之外它還提供了其它的URIs來限定流派和專輯。內容提供者一般會把支持的URIs定義成常量,在第二篇和第三篇教程中你將會看到它們
Content Types
一個內容類型同時是媒體類型和圖片類型的話,用斜槓來分開。一個典型的例子如"image/png"。媒體類型被指定爲"image/png",內容進一步被指定爲是一張png類型的圖片。
對於URIs,Android也定義了兩種固定的類型(directory-based和id-based),如下表所示。
The media types used for content providers
Type |
Usage |
Constant |
---|
vnd.android.cursor.item |
Used for single records |
ContentResolver.CURSOR_ITEM_BASE_TYPE |
vnd.android.cursor.dir |
Used for multiple records |
ContentResolver.CURSOR_DIR_BASE_TYPE |
內容提供者使用的subtype指定了具體的產品,所以需要區分於內容提供者所支持的其它類型。subtypes的命名規範爲"vnd.yourcompanyname.contenttype"所示,在我們的例子程序中subtype爲"vnd.cpsample.letitems"
大多數內容提供者都會支持多種subtypes。以一個媒體播放器爲例,subtypes可能爲流派,樂隊, 標題, 音樂家等等
這個標準內容提供者可用嗎?
在Android的API中有許多的內容提供者。所有標準的內容提供者API都定義在android.provider包中。
The standard content providers of Android
Provider |
Since |
Usage |
---|
Browser |
SDK 1 |
Manages your web-searches, bookmarks and browsing-history. |
CalendarContract |
SDK 14 |
Manages the calendars on the user’s device. |
CallLog |
SDK 1 |
Keeps track of your call history. |
Contacts |
SDK 1 |
The old and deprecated content provider for managing contacts. You should only use this provider if you need to support an SDK prior to SDK 5! |
ContactsContract |
SDK 5 |
Deals with all aspects of contact management. Supersedes the Contacts-content provider. |
MediaStore |
SDK 1 |
The content provider responsible for all your media files like music, video and pictures. |
Settings |
SDK 1 |
Manages all global settings of your device. |
UserDictionary |
SDK 3 |
Keeps track of words you add to the default dictionary. |
當你需要這些標準內容提供者提供的數據時,請使用它們。比如當有應用忽視了用戶字典時,用戶就有可能在多個應用中都需重新輸入相同的詞,這是多麼的糟糕。
當然你應該永遠牢記並不是所有標準的內容提供者在當前設備上可用。比如一個平板可能並沒有撥打電話的統計信息。因此你應該總是測試它的可用性。一個比較可行的方法是查詢當前內容提供者是否存在,如果返回null則表示不存在。CRUD操作可能會拋一個異常(unknow URI)
這一教程的學習要點
在這一個教程中我們學習了內容提供者URIs的兩種類型,以及對應這兩種媒體類型的內容類型。我列出了Android提供的一些內容提供者,你在項目中可以直接使用。至於如何去使用它們將在第二篇(
Using
content providers)教程中介紹
相關文章