android--創建自己的內容提供器
想要實現跨程序共享數據需要用到內容提供器,內容提供器給別的應用提供了訪問接口,可以新建一個類去繼承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 publicUri 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--創建自己的內容提供器