android--建立自己的內容提供器

來源:互聯網
上載者:User

標籤:xtend   value   query   介面   androi   bre   參數   str   定義   

想要實現跨程式共用資料需要用到內容提供器,內容提供器給別的應用提供了提供者,可以建立一個類去繼承ContentProvider來建立一個自己的內容提供器。ContentProvider類中有6種抽象方法,在使用子類繼承的時候需要全部重寫。

 1 public class Myprovider extends ContentProvider { 2  3     @Override 4     /* 5     初始化時調用 6     通常會在這裡完成對資料庫的建立和升級等操作,返回true表示初始化成功。 7     只有當存在ContentResolver嘗試訪問程式中的資料時,才會進行初始化。 8      */ 9     public boolean onCreate() {10         return false;11     }12 13     /*14     查詢資料15     uri 確定查詢的是那一張表16     projection 查詢那一列17     selection 和 selectionArgs查詢那些行18     sortOrder 對結果進行排序19     返回的資料存放在Cursor對象中20      */21     @Override22     public Cursor query(Uri uri,  String[] projection,  String selection,  String[] selectionArgs,  String sortOrder) {23         return null;24     }25 26     /*27     根據傳入的資料URI來返回相應的MIME類型28      */29     @Override30     public String getType(Uri uri) {31         return null;32     }33     /*34     添加資料35     uri 確定添加的是那一張表36     values 儲存待添加的資料37     返回一條表示這條新記錄的URI38      */39     @Override40     public Uri insert(Uri uri,  ContentValues values) {41         return null;42     }43     /*44     刪除資料45     selection 和 selectionArgs 刪除那些行46     返回被刪除的行數47      */48     @Override49     public int delete(Uri uri,  String selection,  String[] selectionArgs) {50         return 0;51     }52     /*53     更新已有的資料54     uri 確定更新的是那一張表55     values 新資料56     selection 和 selectionArgs 更新那些行57     會返回更新的行數58      */59     @Override60     public int update(Uri uri,  ContentValues values,  String selection,  String[] selectionArgs) {61         return 0;62     }63 64 }

  一個標準的內容URI寫法是這樣的:

  content://com.example.app.providder/table1

  這就表示想要訪問com.example.app這個應用中的table1表中的資料

  content://com.example.app.providder/table1/1

  這表示想要訪問com.example.app這個應用中的table1表中的id為1的資料

  content://com.example.app.providder/*

  這表示想要訪問com.example.app這個應用中的任意表

  content://com.example.app.providder/table1/#

  這表示想要訪問com.example.app這個應用中的table1表中的任意行的資料

  其中 * 表示任意長度的任一字元  # 表示任意長度的數字

 

  然後使用UriMatcher這個類實現匹配內容URI的功能,UriMatcher中有一個addURI()的方法,3個參數,可以分別把authority、path、和一個自訂代碼,當調用UriMatcher的match()方法是,將一個URI傳入,傳回值某個能夠匹配這個URI的自訂代碼。

  修改後的代碼:

  

 1 public class Myprovider extends ContentProvider { 2  3     //用於識別URI的自訂代碼 4     public static final int TABLE1_DIR = 0; 5  6     public static final int TABLE1_ITEM = 1; 7  8     public static final int TABLE2_DIR = 2; 9 10     public static final int TABLE2_ITEM = 3;11 12     //建立UriMatcher的執行個體13     private static UriMatcher uriMatcher;14 15     //將自訂代碼和希望的URI匹配16     static {17         uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);18         uriMatcher.addURI("xbt.exp11.provider","table1",TABLE1_DIR);19         uriMatcher.addURI("xbt.exp11.provider","table1/#",TABLE1_ITEM);20         uriMatcher.addURI("xbt.exp11.provider","table2",TABLE2_DIR);21         uriMatcher.addURI("xbt.exp11.provider","table2/#",TABLE2_ITEM);22 23     }24     ...25     /*26     查詢資料27     uri 確定查詢的是那一張表28     projection 查詢那一列29     selection 和 selectionArgs查詢那些行30     sortOrder 對結果進行排序31     返回的資料存放在Cursor對象中32      */33     @Override34     public Cursor query(Uri uri,  String[] projection,  String selection,  String[] selectionArgs,  String sortOrder) {35 36         //判斷希望被訪問的資料是什麼資料37         switch (uriMatcher.match(uri)){38             case TABLE1_DIR:39                 //查詢table1表中的所有資料40                 break;41             case TABLE1_ITEM:42                 //查詢table1表中的單條資料43                 break;44             case TABLE2_DIR:45                 //查詢table2表中的所有資料46                 break;47             case TABLE2_ITEM:48                 //查詢table2表中的單條資料49                 break;50             default:51                 break;52         }53         ...54     }55 56     ...57 58 }

  insert()、update()、delete()也可以使用switch (uriMatcher.match(uri)){..}這樣的判斷語句判斷出希望訪問的是那張表,再進行相應的操作

  getType()方法是一個所有的內容提供器都必須提供的一個方法,用於擷取Uri對象所對應的MIME類型。

  一個內容URI所對應的MIME字串主要由3部分組成,android的格式規定是:

  1、必須以vnd開頭

  2、如果內容URI以路徑結尾,則後接android.cursor.dir/,如果內容URI以id結尾,則後接android.cursor.item/

  3、最後接上vnd.<authority>.<path>

  所以,對於content://com.example.app.providder/table1這個內容URI,它所對應的MIME類型就可以寫成:

  vnd.android.cursor.dir/vnd.example.app.providder.table1

  對於content://com.example.app.providder/table1/1這個內容URI,它所對應的MIME類型就可以寫成:

  vnd.android.cursor..item/vnd.example.app.providder.table1

  實現getType()方法的邏輯如下:

public class Myprovider extends ContentProvider {...    /*    根據傳入的資料URI來返回相應的MIME類型     */    @Override    public String getType(Uri uri) {                switch (uriMatcher.match(uri)){            case TABLE1_DIR:                return "vnd.android.cursor.dir/vnd.xbt.exp11.provider.table1";            case TABLE1_ITEM:                return "vnd.android.cursor.item/vnd.xbt.exp11.provider.table1";            case TABLE2_DIR:                return "vnd.android.cursor.dir/vnd.xbt.exp11.provider.table2";            case TABLE2_ITEM:                return "vnd.android.cursor.item/vnd.xbt.exp11.provider.table2";            default:                break;        }        return null;    }}

 

 

android--建立自己的內容提供器

相關文章

聯繫我們

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