Android開發實踐 ContentProvider和ContentResolver

來源:互聯網
上載者:User

標籤:

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.