1. 程式人生 > >android--創建自己的內容提供器

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

長度 delete fin 獲取 存在 bsp oncreate 功能 跨程序

想要實現跨程序共享數據需要用到內容提供器,內容提供器給別的應用提供了訪問接口,可以新建一個類去繼承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 @Override 22 public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
23 return null; 24 } 25 26 /* 27 根據傳入的數據URI來返回相應的MIME類型 28 */ 29 @Override 30 public String getType(Uri uri) { 31 return null; 32 } 33 /* 34 添加數據 35 uri 確定添加的是那一張表 36 values 保存待添加的數據 37 返回一條表示這條新記錄的URI 38 */ 39 @Override 40 public
Uri insert(Uri uri, ContentValues values) { 41 return null; 42 } 43 /* 44 刪除數據 45 selection 和 selectionArgs 刪除那些行 46 返回被刪除的行數 47 */ 48 @Override 49 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 @Override 60 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     @Override
34     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--創建自己的內容提供器