標籤: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--建立自己的內容提供器