標籤:
原文地址:http://www.cnblogs.com/bravestarrhu/archive/2012/05/02/2479461.html
Content Provider內容提供者 :
android平台提供了Content Provider使一個應用程式的指定資料集提供給其他應用程式。這些資料可以儲存在檔案系統中、在一個SQLite資料庫、或以任何其他合理的方式,
其他應用可以通過ContentResolver類(見ContentProviderAccessApp例子)從該內容提供者中擷取或存入資料.(相當於在應用外包了一層殼),
只有需要在多個應用程式間共用資料是才需要內容提供者。例如,通訊錄資料被多個應用程式使用,且必須儲存在一個內容提供者中
它的好處:統一資料訪問方式。
android系統內建的內容提供者(頂級的表示資料庫名,非頂級的都是表名)這些內容提供者在SDK文檔的android.provider Java包中都有介紹。見:http://developer.android.com/reference/android/provider/package-summary.html
├────Browser
├────CallLog
├────Contacts
│ ├────Groups
│ ├────People
│ ├────Phones
│ └────Photos
├────Images
│ └────Thumbnails
├────MediaStore
│ ├────Albums
│ ├────Artists
│ ├────Audio
│ ├────Genres
│ └────Playlists
├────Settings
└────Video
CallLog:地址和接收到的電話資訊
Contact.People.Phones:儲存電話號碼
Setting.System:系統設定和喜好設定
使用Content Provider對外共用資料的步驟
1>繼承ContentProvider類並根據需求重寫以下方法:
public boolean onCreate();//處理初始化操作 /** * 插入資料到內容提供者(允許其他應用向你的應用中插入資料時重寫) * @param uri * @param initialValues 插入的資料 * @return */ public Uri insert(Uri uri, ContentValues initialValues); /** * 從內容提供者中刪除資料(允許其他應用刪除你應用的資料時重寫) * @param uri * @param selection 條件陳述式 * @param selectionArgs 參數 * @return */ public int delete(Uri uri, String selection, String[] selectionArgs); /** * 更新內容提供者已存在的資料(允許其他應用程式更新你應用的資料時重寫) * @param uri * @param values 更新的資料 * @param selection 條件陳述式 * @param selectionArgs 參數 * @return */ public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs); /** * 返回資料給調用者(允許其他應用從你的應用中擷取資料時重寫) * @param uri * @param projection 列名 * @param selection 條件陳述式 * @param selectionArgs 參數 * @param sortOrder 排序 * @return */ public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) ; /** * 用於返回當前Uri所代表資料的MIME類型 * 如果操作的資料為集合類型(多條資料),那麼返回的類型字串應該為vnd.android.cursor.dir/開頭 * 例如要得到所有person記錄的Uri為content://com.bravestarr.provider.personprovider/person, * 那麼返回的MIME類型字串應該為"vnd.android.cursor.dir/person" * 如果操作的資料為單一資料,那麼返回的類型字串應該為vnd.android.cursor.item/開頭 * 例如要得到id為10的person記錄的Uri為content://com.bravestarr.provider.personprovider/person/10, * 那麼返回的MIME類型字串應該為"vnd.android.cursor.item/person" * @param uri */ public String getType(Uri uri)
這些方法中的Uri參數,得到後需要進行解析然後做對應處理,Uri表示要操作的資料,包含兩部分資訊:
1.需要操作的contentprovider
2.對contentprovider中的什麼資料進行操作,一個Uri格式:結構頭://authorities(網域名稱)/路徑(要操作的資料,根據業務而定)
content://com.bravestarr.provider.personprovider/person/10
說明:contentprovider的結構頭已經由android規定為content://
authorities用於唯一標識這個contentprovider程式,外部調用者可以根據這個找到他
路徑表示我們要操作的資料,路徑的構建根據業務而定.路徑格式如下:
要操作person表行號為10的記錄,可以這樣構建/person/10
要操作person表的所有記錄,可以這樣構建/person
2>在AndroidManifest.xml中使用<provider>對ContentProvider進行配置註冊(內容提供者註冊它自己就像網站註冊網域名稱),ContentProvider採用authoritie(原意授權,可理解為網域名稱)作為唯一標識,方便其他應用能找到
<application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <!-- authorities屬性命名建議:公司名.provider.SomeProvider--> <provider android:name=".PersonProvider" android:authorities="com.bravestarr.provider.personprovider"/> ...</application>
Android學習總結——Content Provider