ContentProvider學習小結

ContentProvider學習小結

對於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對象實現。數據庫

    File 即常說的文件(I/O)存儲方法,經常使用於存儲大量的數據,但缺點是更新數據困難。在Android中一般使用File存儲方式是用Context.openFileOutput(String fileName, int mode)和Context.openFileInput(String fileName),經過數據流進行操做。

    網絡存儲:經過Android的網絡數據包保存數據在網絡上,須要網絡的支持。

以上四種存儲操做通常針對的是應用自己的數據,若是要對其它應用的數據進行操做,那麼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返回單個結果(聯繫人信息中ID45的聯繫人記錄)app

當使用ContentProvider在不一樣的應用程序中共享數據時,其數據的暴露方式是採起相似數據庫中表的方法。而ContentResolver 剛好是採用相似數據庫的方法來從ContentProvider中存取數據的,它是經過Uri來查詢ContentProvider中提供的數據,查詢時,還需知道目的數據庫的名稱,數據段的數據類型,或者說資源的ID。ide

下面是新建ContentProvider的完整流程:函數

  1. 建立一個繼承了ContentProvider父類的類,實現基本的query(),insert(),update(),delete()等方法,這些方法也是暴漏給其它應用調用的數據操做方法。
  2. 在本身應用的AndroidManifest.xml中使用<provider>標籤來設置定義咱們實現的ContentProvider。
  3. 定義一個名爲CONTENT_URI,類型爲public static final的Uri類型的類變量,你必須爲其指定一個惟一的字符串值,最好的方案是以類的全名稱,這也是你查找ContentProvider的惟一標示,此定義與你在上面AndroidManifest.xml中的<provider>標籤中的android:authorities="downloads"是一致的。
  4. 定義你要返回給客戶端的數據列名,此變量就是外部應用對你的數據進行操做的具體字段,通常與你在本地存儲數據的變量名儘可能保持一致,這樣也便於理解調用。若是你正在使用Android數據庫,必須爲其定義一個叫_id的列,它用來表示每條記錄的惟一性。
  5. 建立你的數據存儲系統。大多數ContentProvider使用Android文件系統或SQLite數據庫來保持數據,可是你也能夠以任何你想要的方式來存儲。數據的實際存儲位置就在於此,ContentProvider只是對它進行了一次封裝,而且在實現ContentProvider的接口方法時,會寫明具體操做本地存儲數據的步驟。              。
  6. 若是你要存儲字節型數據,好比位圖文件等,數據列實際上是一個表示實際保存文件的URI字符串,經過它來讀取對應的文件數據。處理這種數據類型的Content Provider須要實現一個名爲_data的字段,_data字段列出了該文件在Android文件系統上的精確路徑。這個字段不只是供客戶端使用,並且也能夠供ContentResolver使用。客戶端能夠調用ContentResolver.openOutputStream()方法來處理該URI指向的文件資源;若是是ContentResolver自己的話,因爲其持有的權限比客戶端要高,因此它能直接訪問該數據文件。
  7. 查詢返回一個Cursor類型的對象。全部執行寫操做的方法如insert(), update() 以及delete()都將被監聽。咱們能夠經過使用ContentResover().notifyChange()方法來通知監聽器關於數據更新的信息。

 

 

下面是關於DownloadProvider的簡單介紹:學習

  1. DownloadManager是系統對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。

  1. Downloads類定義了外部操做DownloadProvider的相關字段。路徑以下:

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」)就是全部下載文件的詳細信息列表。

相關文章
相關標籤/搜索