一、創建一個類,繼承ContentProvider,重寫onCreate,query,insert,update,delete,getType方法
二、在清單文件中聲明provider節點
<provider
android:authorities="cn.test.provider" android:name="cn.test.contactproviderdemo.MyProvider"
android:exported="true">
</provider>
這裏需要注意的是:
android:authorities這個字符串相當於是一個攔截器,需要對應的URI匹配上才能訪問對應的數據。
另外,在安卓4.4以上的版本中,還需要配置android:exported=”true”
三、通過UriMatcher添加對應的URI匹配規則
private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);
// 這裏設置的數字,不爲-1,但是最好爲正數
private static final int QUERY_SUCCESS = 1;
private static final int INSERT_MATCHED = 2;
private static final int UPDATE_MATCHED = 3;
private static final int DELETE_MATCHED = 4;
static {
// 給當前的URI匹配器添加一條匹配規則
sURIMatcher.addURI("cn.test.provider", "query", QUERY_SUCCESS);
sURIMatcher.addURI("cn.test.provider", "insert", INSERT_MATCHED);
sURIMatcher.addURI("cn.test.provider", "update", UPDATE_MATCHED);
sURIMatcher.addURI("cn.test.provider", "delete", DELETE_MATCHED);
}
具體對數據庫的增刪改查,在這裏就不貼代碼出來了,接下來,就是其他應用訪問這個應用的數據庫了。
四、在一個新的工程下面,使用內容解析者獲取數據
示例代碼:
public void query(View v) {
// 獲取內容解析者
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://cn.test.provider/query");
Cursor cursor = resolver.query(uri, null, null, null, null);
while (cursor.moveToNext()) {
String name = cursor.getString(cursor.getColumnIndex("name"));
System.out.println("name=" + name);
}
}
public void insert(View v) {
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://cn.test.provider/insert");
ContentValues values = new ContentValues();
values.put("name", "二狗子");
values.put("phone", "489756848");
values.put("age", 12);
Uri insert = resolver.insert(uri, values);
System.out.println(insert);
}
public void delete(View v) {
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://cn.test.provider/delete");
String where = "name = ?";
String [] selectionArgs = {"大牛"};
int delete = resolver.delete(uri, where, selectionArgs);
Toast.makeText(getApplicationContext(), "刪除了" + delete + "條數據", Toast.LENGTH_SHORT).show();
}
public void update(View v) {
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://cn.test.provider/update");
ContentValues values = new ContentValues();
values.put("name", "小二黑");
String where = "name = ?";
String [] selectionArgs = {"二狗"};
int update = resolver.update(uri, values, where, selectionArgs);
Toast.makeText(getApplicationContext(), "更新了" + update + "條數據", Toast.LENGTH_SHORT).show();
}
這裏又一點需要說明的是,Uri資源的訪問,必須加上content://,另外,cn.test.provider對應的是另一個工程再清單文件中android:authorities字段中聲明的字符串,後面跟着的字符比如,query,insert,delete等等,是在另一個工程中,在static靜態代碼塊中由UriMatcher對象add進來的匹配規則,如果對應上就會執行相應的方法。