對於Android的一個應用程序,數據存儲操做是必不可少的。所以,Android系統提供了五種數據存儲方式,分別是:SharedPreferences、SQLite、Content Provider、File和網絡存儲。因爲Android系統中,數據基本都是私有的,通常存放在屬於本身的「data/data/程序包名」目錄下,要在不一樣的應用之間實現數據共享,經常使用的方式是使用Content Provider。java
SQLite: SQLite是一個輕量級的數據庫,支持基本SQL語法,是常被採用的一種數據存儲方式。Android爲此數據庫提供了一個名爲SQLiteDatabase的類,封裝了一些操做數據庫的API。android
SharedPreferences: 一種經常使用的數據存儲方式,經常使用於存儲比較簡單的數據配置參數,其本質就是一個存儲key-value鍵值對數據的xml文件,其存儲位置在/data/data/<包名>/shared_prefs目錄下。 SharedPreferences對象自己只能獲取數據而不支持存儲和修改,存儲修改是經過Editor對象實現。數據庫
以上四種存儲操做通常針對的是應用自己的數據,若是要對其它應用的數據進行操做,那麼ContentProvider將是很好的選擇。ContentProvider爲存儲和讀取數據提供了統一的接口,使應用程序能夠實現數據共享,Android內置的許多數據都是使用ContentProvider形式,供開發者調用的(如視頻,音頻,圖片,通信錄等)。使用ContentProvider的好處是開發人員不須要考慮數據內部是怎麼存儲的,好比說若是咱們想利用ContenProvider來存數據,只需告訴insert函數該ContentProvider的uri和想存入的數據(包括列名和數值),查詢時也是同樣,只需輸入Uri和查詢的表,列名和查詢條件,至於ContentProvider裏面是怎麼進行這些操做的咱們不須要知道。瀏覽器
ContentProvider經過Uri類進行匹配關聯,例如:Uri uri = Uri.parse("content://com.changcheng.provider.contactprovider/contact")。在ContentProvider中使用的查詢字符串有別於標準的SQL查詢。不少諸如select, add, delete, modify等操做咱們都使用一種特殊的URI來進行,URI爲通用資源標識符,它表明的是要操做的數據,Android中的每一種資源(好比文本,圖像,視頻等)均可以用Uri來表示。Android中的Uri由如下三部分組成:」content://」(即authory) ,數據的路徑,資源標識ID(可選)。其中若是存在ID,則表示某一個具體的資源,若是不存在ID,則表示路徑下的總體。如下是一些示例Uri:網絡
content://media/internal/images 這個URI將返回設備上存儲的全部圖片
content://contacts/people/ 這個URI將返回設備上的全部聯繫人信息
content://contacts/people/45 這個URI返回單個結果(聯繫人信息中ID爲45的聯繫人記錄)app
當使用ContentProvider在不一樣的應用程序中共享數據時,其數據的暴露方式是採起相似數據庫中表的方法。而ContentResolver 剛好是採用相似數據庫的方法來從ContentProvider中存取數據的,它是經過Uri來查詢ContentProvider中提供的數據,查詢時,還需知道目的數據庫的名稱,數據段的數據類型,或者說資源的ID。ide
下面是新建ContentProvider的完整流程:函數
下面是關於DownloadProvider的簡單介紹:學習
frameworks\base\core\java\android\app\DownloadManager.java視頻
瀏覽器下載文件先調用DownloadManager的enqueue函數進行下載,enqueue函數主要是將用戶發送的Request實例分解組成一個ContentValues實例,接着它會執行ContentResolver.insert(Downloads.Impl. ALL_DOWNLOADS_CONTENT_URI, values),這個函數就是 DownloadProvider實現的insert函數,經過它把下載信息添加到數據庫中,最後enqueue函數返回插入這條數據後返回的ID。
frameworks\base\core\java\android\provider\Downloads.java
在這個類中定義了DownloadProvider的相關字段變量,例如:Uri ALL_DOWNLOADS_CONTENT_URI =Uri.parse("content://downloads/all_downloads")就是定義了它的惟一地址,以便於外部應用直接經過ContentResolver調用此Uri查找DownloadProvider中的數據;String _DATA = "_data"定義了下載文件保存路徑對應的列字段;COLUMN_MIME_TYPE = "mimetype"定義了下載文件的類型等
3 .DownloadProvider位於packages\providers\DownloadProvider路徑下,繼承重寫ContentProvider的基本數據操做函數delete(),query(),insert(),update(),getType()等,外部應用經過ContentResolver就能夠操做這些函數,方便不一樣應用之間數據共享操做。DatabaseHelper是繼承SQLiteOpenHelper的內部類,在這裏創建的數據庫(DB_NAME = 「downloads.db」)就是DownloadProvider保存數據的位置,而數據庫中的表(DB_TABLE = 「downloads」)就是全部下載文件的詳細信息列表。