Android 應用程序之間數據共享—ContentProvider

Android 應用程序之間數據共享—-ContentResolver中,已經說明了Android是如何實現應用程序之間數據共享的,並詳細解析瞭如何獲取其他應用程序共享的數據。ContentProviders存儲和檢索數據,通過它可以讓所有的應用程序訪問到,這也是應用程序之間唯一共享數據的方法。那麼如何將應用程序的數據暴露出去?

通過以前文章的學習,知道ContentResolver是通過ContentProvider來獲取其他與應用程序共享的數據,那麼ContentResolver與ContentProvider的接口應該差不多的。

其中ContentProvider負責

  • 組織應用程序的數據;
  • 向其他應用程序提供數據;

ContentResolver則負責

  • 獲取ContentProvider提供的數據;
  • 修改/添加/刪除更新數據等;

ContentProvider 是如何向外界提供數據的?

Android提供了ContentProvider,一個程序可以通過實現一個ContentProvider的抽象接口將自己的數據完全暴露出去,而且ContentProviders是以類似數據庫中表的方式將數據暴露,也就是說ContentProvider就像一個“數據庫”。那麼外界獲取其提供的數據,也就應該與從數據庫中獲取數據的操作基本一樣,只不過是採用URI來表示外界需要訪問的“數據庫”。至於如何從URI中識別出外界需要的是哪個“數據庫”,這就是Android底層需要做的事情了,不在此詳細說。簡要分析下ContentProvider向外界提供數據操作的接口:

query(Uri, String[], String, String[], String)

insert(Uri, ContentValues)

update(Uri, ContentValues, String, String[])

delete(Uri, String, String[])

這些操作與數據庫的操作基本上完全一樣,在此不詳細說,具體的解析可以參考Android Sqlite解析篇中的詳細說明。需要特殊說明的地方是URI:

URI

在URI的D部分可能包含一個_ID ,這個應該出現在SQL語句中的,可以以種特殊的方式出現,這就要求我們在提供數據的時候,需要來額外關注這個特殊的信息。Android  SDK推薦的方法是:在提供數據表字段中包含一個ID,在創建表時INTEGER PRIMARY KEY AUTOINCREMENT標識此ID字段。

ContentProvider 是如何組織數據的?

組織數據主要包括:存儲數據,讀取數據,以數據庫的方式暴露數據。數據的存儲需要根據設計的需求,選擇合適的存儲結構,首選數據庫,當然也可以選擇本地其他文件,甚至可以是網絡上的數據。數據的讀取,以數據庫的方式暴露數據這就要求,無論數據是如何存儲的,數據最後必須以數據的方式訪問。

可能還有2個問題,是需要關注的。

  1. ContentProvider是什麼時候創建的,是誰創建的?訪問某個應用程序共享的數據,是否需要啓動這個應用程序?這個問題在Android SDK中沒有明確說明,但是從數據共享的角度出發,ContentProvider應該是Android在系統啓動時就創建了,否則就談不上數據共享了。這就要求在AndroidManifest.XML中使用<provider>元素明確定義。
  2. 可能會有多個程序同時通過ContentResolver訪問一個ContentProvider,會不會導致像數據庫那樣的“髒數據”?這個問題一方面需要數據庫訪問的同步,尤其是數據寫入的同步,在AndroidManifest.XML中定義ContentProvider的時候,需要考慮是<provider>元素multiprocess屬性的值;另外一方面Android在ContentResolver中提供了notifyChange()接口,在數據改變時會通知其他ContentObserver,這個地方應該使用了觀察者模式,在ContentResolver中應該有一些類似register,unregister的接口。

至此,已經對ContentProvider提供了比較全面的分析,至於如何創建ContentProvider,可通過2種方法:創建一個屬於你自己的ContentProvider或者將你的數據添加到一個已經存在的ContentProvider中,當然前提是有相同數據類型並且有寫入Content provider的權限。在Android SDK的sample中提供的Notepad具體實例中去看源代碼!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章