Android共享數據 ContentProvider 的使用

ContentResolver 與 ContentProvider 的做用android

ContentProvider 負責:sql

組織應用程序數據數據庫

向其餘應用程序提供共享數據安全

 

ContentResolver 負責ide

獲取ContentProvider提供的數據.net

增刪改查 數據線程

 

讓本身的數據和其它應用程序共享有兩種方式:建立本身的Content Provider (即繼承自Content Provider的子類) 或者是將本身的數據添加到已有的Content Provider中去,後者須要保證現有的Content Provider和本身的數據類型相同而且具備該 Content Provider的寫入的權限。 
 
(1)  創建數據的存儲系統 

      數據的存儲系統能夠由開發人員任意決定,通常來說,大多數的Content Provider都經過Android的文件存儲系統或SQLite 數據庫創建本身的數據存儲系統。
 

 (2)擴展 ContentProvider類sqlite

       開發一個繼承自ContentProvider類的 子類代碼來擴展 ContentProvider類,在這個步驟主要的工做是將要共享的數據包裝並以ContentResolver 和  Cursor對象可以訪問到的形式對外展現。具體來講須要實現ContentProvider 類中的6個抽象方法。
       Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder):將查詢的數據以Cursor 對象的形式返回。
        Uri insert(Uri uri, ContentValues values):向 Content Provider中插入新數據記錄,ContentValues 爲數據記錄的列名和列值映射。
        int update(Uri uri, ContentValues values, String selection, String[] selectionArgs):更新Content Provider中已存在的數據記錄。
        int delete(Uri uri, String selection, String[] selectionArgs):從Content Provider中刪除數據記錄。
        String getType(Uri uri):返回Content Provider中的數據( MIME )類型。
        boolean onCreate():當 Content Provider 啓動時被調用。
 
        以上方法將會在ContentResolver 對象中調用,因此很好地實現這些抽象方法會爲ContentResolver提供一個完善的外部接口。除了實現抽象方法外,還能夠作一些提升可用性的工做。
 
        簡言之,本身APP定義一個 ContentProvider的子類,並實現其中的方法後(在這些方法中對本身分享的數據如sqlite或文件等進行操做),就將這個ContentProvider「貢獻」出去了。其餘APP就能對這個ContentProvider進行增刪查改的操做了。
 
        定義一個 URI 類型的靜態常量,命名爲CONTENT_URI。 必須爲該常量對象定義一個惟一的URI字符串,通常的作法是將 ContentProvider子類的全稱類名做爲URI字符串,如: "content://wyf.wpf.MyProvider"。(Android系統中可能不少APP提供了ContentProvider,各自要有各自的URI,不能同名)
        定義每一個字段的列名,若是採用的數據庫存儲系統爲SQLite 數據庫,數據表列名能夠採用數據庫中表的列名。無論數據表中有沒有其餘的惟一標識一個記錄的字段,都應該定義一個"_id"字段 來惟一標識一個記錄。模式使用 "INTEGER PRIMARY KEY AUTOINCREMENT" 自動更新 通常將這些列名字符串定義爲靜態常量, 如"_id"字段名定義爲一個名爲"_ID"  值爲 "_id" 的靜態字符串對象。(無論本身分享給ContentProvider的源數據是sqlite仍是文件,最後都要整理成sqlite數據的形式提供給其餘APP操做 ) 
 
(3)在應用程序的AdnroidManifest.xml 文件中聲明Content Provider組件。 

        建立好一個Content Provider必需要在應用程序的AndroidManifest.xml 中進行聲明,不然該Content Provider對於 Android系統將是不可見的。(艾瑪,你好人好事都作好了,總得說一聲吧,否則別人哪能知道)若是有一個名爲MyProvider的類擴展了 ContentProvider類,聲明該組件的代碼以下:
        <provider name="wyf.wpf.MyProvider"
                 authorities="wyf.wpf.myprovider"
                 ...../>   <!-- 爲<provider>標記添加name、authorities屬性-->
        其中name屬性爲ContentProvider 子類的全稱類名,authorities 屬性惟一標識了一個ContentProvider。還能夠經過 setReadPermission() 和setWritePermission() 來設置其操做權限。固然也能夠再上面的 xml中加入 android:readPermission 或者 android: writePermission屬性來控制其權限。
 
        注意:由於ContentProvider可能被不一樣的進程和線程調用,因此繼承ContentProvider後所實現的那些方法必須是線程安全的。

 

參考資源 :http://blog.csdn.net/berber78/article/details/17680697xml

相關文章
相關標籤/搜索