標籤:
1.關於ContentProvider和ContentResolver
(1)ContentProvider(內容提供者)
ContentProvider是不同應用程式之間進行資料交換的標準API,只提供資料的提供者。
ContentProvider以某種Uri形式對外提供資料,允許其他應用訪問或修改資料,其他應用程式通過ContentResolver根據Uri去訪問操作指定資料。
將一個字串轉換成Uri:
Uri uri = Uri.parse("content://com.gc.contentprovider/test/100");
ContentProvider只有一個onCreate()生命週期方法且只會被調用一次,當其他應用通過ContentResolver第一次訪問該ContentProvider時,onCreate()方法將會被回調。
(2)ContentResolver(內容觀察者)
Content提供了如下方法來擷取ContentResolver:
getContentResolver();
2.ContentProvider、ContentResolver、Uri三者之間的關係
3.開發ContentProvider
開發ContentProvider需要兩步:
第1步:繼承ContentProvider,實現query()、insert()、update()、delete()等方法(這些方法是給其他應用調用的);
第2步:在AndroidManifest.xml註冊該ContentProvider,指定android:authorities屬性(指定ContentProvider對應的Uri)和android:exported屬性(設定android:exported:true表示允許其他應用程式調用)。
接下來實際開發一個ContentProvider:
(1)建立MyProvider,繼承ContentProvider
public class MyProvider extends ContentProvider { // 第一次建立調用 @Override public boolean onCreate() { System.out.println("onCreate"); return true; } // 傳回值表示該ContentProvider所提供資料的MIME類型 @Override public String getType(Uri uri) { System.out.println("getType"); return null; } // 查詢方法,返回查詢得到的Cursor @Override public Cursor query(Uri uri, String[] projection, String where, String[] whereArgs, String sortOrder) { System.out.println(uri + "-query"); System.out.println("where參數:" + where); return null; } // 插入方法,返回新插入記錄的Uri @Override public Uri insert(Uri uri, ContentValues values) { System.out.println(uri + "-insert"); System.out.println("values參數:" + values); return null; } // 刪除方法,返回被刪除的記錄條數 @Override public int delete(Uri uri, String where, String[] whereArgs) { System.out.println(uri + "-delete"); System.out.println("where參數:" + where); return 0; } // 刪除方法,返回被更新的記錄條數 @Override public int update(Uri uri, ContentValues values, String where, String[] whereArgs) { System.out.println(uri + "-update"); System.out.println("where參數:" + where + ",values參數:" + values); return 0; }}
(2)配置ContentProvider
在AndroidManifest.xml中application元素下添加如下子項目即可
<!-- 註冊一個ContentProvider --><!-- exported:指定是否允許其他應用調用,true允許 --><!-- name:指定ContentProvider實作類別的類名 --><!-- authorities:指定ContentProvider對應的Uri --><provider android:exported="true" android:name=".MyProvider" android:authorities="com.gc.contentprovider.myprovider"></provider>
(3)使用ContentResolver調用方法(其他應用程式內)
public class MyResolver extends Activity { ContentResolver resolver; Uri uri = Uri.parse("content://com.gc.contentprovider.myprovider/"); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 擷取系統的ContentResolver對象 resolver = getContentResolver(); } public void query(View source) { // 調用ContentResolver的query()方法,實際返回的是該Uri對應的ContentProvider的query()的傳回值 Cursor c = resolver.query(uri, null, "query_where", null, null); System.out.println("遠程ContentProvider返回的Cursor:" + c); } public void insert(View source) { ContentValues values = new ContentValues(); values.put("name", "android"); // 調用ContentResolver的insert()方法,實際返回的是該Uri對應的ContentProvider的insert()的傳回值 Uri newUri = resolver.insert(uri, values); System.out.println("遠程ContentProvider新插入記錄的Uri:" + newUri); } public void update(View source) { ContentValues values = new ContentValues(); values.put("name", "android"); // 調用ContentResolver的update()方法,實際返回的是該Uri對應的ContentProvider的update()的傳回值 int count = resolver.update(uri, values, "update_where", null); System.out.println("遠程ContentProvider更新記錄數:" + count); } public void delete(View source) { // 調用ContentResolver的delete()方法,實際返回的是該Uri對應的ContentProvider的delete()的傳回值 int count = resolver.delete(uri, "delete_where", null); System.out.println("遠程ContentProvider刪除記錄數:" + count); }}
4.作業系統的ContentProvider
使用ContentResolver作業系統ContentProvider資料的步驟依然是兩步:
第1步:調用Activity的getContentResolver()方法擷取ContentResolver對象;
第2步:根據需要調用ContentProvider的query()、insert()、update()、delete()方法操作資料即可。
注意:需要提前瞭解該ContentProvider的Uri以及該ContentProvider所操作的資料列的列名,這些可通過查閱官方文檔來擷取。
Android開發實踐 ContentProvider和ContentResolver