Android學習(十二) ContentProvider

來源:互聯網
上載者:User

標籤:

一、ContentProvider簡介
       當應用繼承ContentProvider類,並重寫該類用於提供資料和儲存資料的方法,就可以向其他應用共用其資料。雖然使用其他方法也可以對外共用資料,但資料訪問方式會因資料存放區的方式而不同,如:採用檔案方式對外共用資料,需要進行檔案操作讀寫資料;採用sharedpreferences共用資料,需要使用sharedpreferences API讀寫資料。而使用ContentProvider共用資料的好處是統一了資料訪問方式。

 

二、如何?ContentProvider

  1、繼承抽象類別ContentProvider實現一系列針對於資料的增刪改查等方法;

  測試代碼:

package com.example.contentproviderdemo1;import android.content.ContentProvider;import android.content.ContentValues;import android.database.Cursor;import android.net.Uri;public class MyContentProvider extends ContentProvider{    @Override  //建立後被觸發    public boolean onCreate() {        // TODO Auto-generated method stub        return false;    }    @Override //根據uri查詢出selection指定條件所匹配的記錄,可以指定列,和排序方式    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {        // TODO Auto-generated method stub        return null;    }    @Override  //返回當前Uri的MIME類型,如果URI對應的資料可能包括多條記錄,    //那麼MIME類型字串就是以vnd.android.dir/開頭。    //如果該URI對應的資料只有一條記錄,那麼MIME類型字串就是以vnd.android.cursor.item/開頭。    public String getType(Uri uri) {        // TODO Auto-generated method stub        return null;    }    @Override  //根據Uri插入values對應的資料    public Uri insert(Uri uri, ContentValues values) {        // TODO Auto-generated method stub        return null;    }    @Override //根據uri刪除selection指定的條件所匹配的記錄    public int delete(Uri uri, String selection, String[] selectionArgs) {        // TODO Auto-generated method stub        return 0;    }    @Override  //根據uri修改selection指定條件所匹配的記錄    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {        // TODO Auto-generated method stub        return 0;    }}

  2、需要在AndroidMainfest.xml中完成對ContentProvider的註冊;  

<application        android:allowBackup="true"        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme" >        <activity            android:name="com.example.contentproviderdemo1.MainActivity"            android:label="@string/app_name" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <!-- name:contentprovider的名字,authorities:全域的包名,不允許有重複 -->        <provider android:name="myprovider" android:authorities="com.example.contentproviderdemo1"></provider>    </application>

 

三、Uri類簡介

  Uri代表了要操作的資料,Uri主要包含了兩部分資訊:1.需要操作的ContentProvider ,2.對ContentProvider中的什麼資料進行操作.  一個Uri由以下幾部分組成:

  1.scheme:ContentProvider(內容提供者)的scheme已經由Android所規定為:content://。

  2.主機名稱(或Authority):用於唯一標識這個ContentProvider,外部調用者可以根據這個標識來找到它,必須和設定檔中的android:authorities名稱一致。

  3.路徑(path):可以用來表示我們要操作的資料,路徑的構建應根據業務而定,如下:
    1)要操作contact表中id為10的記錄,可以構建這樣的路徑:/contact/10
    2)要操作contact表中id為10的記錄的name欄位, contact/10/name
    3)要操作contact表中的所有記錄,可以構建這樣的路徑:/contact


  要操作的資料不一定來自資料庫,也可以是檔案等他儲存方式,如下:
  要操作xml檔案中contact節點下的name節點,可以構建這樣的路徑:/contact/name
  如果要把一個字串轉換成Uri,可以使用Uri類中的parse()方法,如下:
  Uri uri = Uri.parse("content://com.changcheng.provider.contactprovider/contact")

   

 四、UriMatcher、ContentUrist和ContentResolver簡介
       因為Uri代表了要操作的資料,所以我們很經常需要解析Uri,並從Uri中擷取資料。Android系統提供了兩個用於操作Uri的工具類,分別為UriMatcher 和ContentUris 。掌握它們的使用,會便於我們的開發工作。

       UriMatcher:用於匹配Uri,它的用法如下:
       1.首先把你需要匹配Uri路徑全部給註冊上,如下:
       //常量UriMatcher.NO_MATCH表示不匹配任何路徑的返回碼(-1)。
       UriMatcher  uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
       //如果match()方法匹配content://com.changcheng.sqlite.provider.contactprovider/contact路徑,返回匹配碼為1
       uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact”, 1);//添加需要匹配uri,如果匹配就會返回匹配碼
       //如果match()方法匹配   content://com.changcheng.sqlite.provider.contactprovider/contact/230路徑,返回匹配碼為2
       uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact/#”, 2);//#號為萬用字元
      
       2.註冊完需要匹配的Uri後,就可以使用uriMatcher.match(uri)方法對輸入的Uri進行匹配,如果匹配就返回匹配碼,匹配碼是調用addURI()方法傳入的第三個參數,假設匹配content://com.changcheng.sqlite.provider.contactprovider/contact路徑,返回的匹配碼為1。

       ContentUris:用於擷取Uri路徑後面的ID部分,它有兩個比較實用的方法:
•         withAppendedId(uri, id)用於為路徑加上ID部分
•         parseId(uri)方法用於從路徑中擷取ID部分

       ContentResolver:當外部應用需要對ContentProvider中的資料進行添加、刪除、修改和查詢操作時,可以使用ContentResolver 類來完成,要擷取ContentResolver 對象,可以使用Activity提供的getContentResolver()方法。 ContentResolver使用insert、delete、update、query方法,來操作資料。
四、ContentProvider樣本程式
Manifest.xml中的代碼:

Android學習(十二) ContentProvider

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.