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

    1
    Android 數據庫 C/C++ Go 18311 次瀏覽

    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.jpg

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

    ContentProvider 是如何組織數據的?

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

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

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

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

    轉自:http://www.moandroid.com/?p=157

    相似問題

    相關經驗

    相關資訊

    相關文檔

  • sesese色