標籤:
ContentResolver 與 ContentProvider 的作用
ContentProvider 負責:
組織應用程式資料
向其他應用程式提供共用資料
ContentResolver 負責
擷取ContentProvider提供的資料
增刪改查 資料
讓自己的資料和其它應用程式共用有兩種方式:建立自己的Content Provider (即繼承自Content Provider的子類) 或者是將自己的資料添加到已有的Content Provider中去,後者需要保證現有的Content Provider和自己的資料類型相同並且具有該 Content Provider的寫入的許可權。 (1) 建立資料的儲存系統
資料的儲存系統可以由開發人員任意決定,一般來講,大多數的Content Provider都通過Android的檔案儲存體系統或SQLite 資料庫建立自己的資料存放區系統。
(2)擴充 ContentProvider類
開發一個繼承自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/17680697
Android共用資料 ContentProvider 的使用