安卓ContentProvider与ContentResolver
简介
在安卓中,ContentProvider(内容提供者)是必不可少的四大组件之一。
ContentProvider的作用是对外共享数据,通过ContentProvider把应用中的数据传递给其他应用访问。
内容提供者可以将一些特定的应用程序数据提供给其他的应用程序使用。数据可以存在文件系统,也可以是SQLite数据库等。
内容提供者继承ContentProivder基类,其他应用程序使用ContentResolver基类来获取到共享数据。
ContentProvider共享数据库
public class UserInfoContentProvider extends ContentProvider {
static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
static int Query_Success = 1;
static int Insert_Success = 1;
static int Delete_Success = 1;
static int Update_Success = 1;
static {
uriMatcher.addURI("www.baidu.com.cn", "query", Query_Success);
uriMatcher.addURI("www.baidu.com.cn", "insert", Insert_Success);
uriMatcher.addURI("www.baidu.com.cn", "delete", Delete_Success);
uriMatcher.addURI("www.baidu.com.cn", "update", Update_Success);
}
private Helper helper;
@Override
public boolean onCreate() {
helper = new Helper(getContext());
SQLiteDatabase db = helper.getWritableDatabase();
db.close();
return false;
}
URI可以当作是一种标识符,用于标识主机名或authority("www.baidu.com.cn")。
query,insert,delete等等是路径
下面的方法是调用数据库
public Uri insert(Uri uri, ContentValues values) {
int code = uriMatcher.match(uri);
if (code == Insert_Success) {
SQLiteDatabase db = helper.getWritableDatabase();
long insert = db.insert("user", null, values);
db.close();
return Uri.parse("id:" + insert);
}
return Uri.parse("没有这个东西");
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int code = uriMatcher.match(uri);
if (code == Delete_Success) {
SQLiteDatabase db = helper.getWritableDatabase();
int result = db.delete("user", selection, selectionArgs);
db.close();
return result;
}
return -1;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
int code = uriMatcher.match(uri);
if (code == Update_Success) {
SQLiteDatabase db = helper.getWritableDatabase();
int update = db.update("user", values, selection, selectionArgs);
db.close();
return update;
}
return -1;
}
这是一个调用数据库的应用程序,用ContentProvider来提供给其他应用程序使用,最后还要加上注册清单文件上面写上
<provider
android:name="com.example.sqlite.UserInfoContentProvider"
android:authorities="www.baidu.com.cn"
android:exported="true"
>
</provider>
这样ContentProvider就写好了。
ContentResolver获取提供信息
内容提供了之后,就是ContentResolver基类的解析共享了
再创建一个android app应用程序,获取ContentProvider的共享SQLite数据库操作
下面就是数据库的增删查改操作,每一个操作基本都一样:
获取内容解析者
Uri标示协议 -------> content:
www.baidu.com.cn是主机名或者authority
insert,delete,update,select是路径
然后就是使用ContentResolver的对象获取到ContentProvider提供的方法,使用方法操作数据库。
public void button_insert(View v) {
ContentResolver contentResolver = getContentResolver();
Uri uri = Uri.parse("content://www.baidu.com.cn" + "/insert");
ContentValues values = new ContentValues();
values.put("name", "赵六");
values.put("tel", "110");
values.put("deadTime", System.currentTimeMillis());
Uri insert = contentResolver.insert(uri, values);
System.out.println("insert:" + insert.toString());
}
public void button_delete(View v) {
ContentResolver contentResolver = getContentResolver();
Uri uri = Uri.parse("content://www.baidu.com.cn" + "/delete");
String where = "name=?";
String[] selectionArgs = { "赵六" };
int delete = contentResolver.delete(uri, where, selectionArgs);
System.out.println("delete:" + delete);
}
public void button_update(View v) {
ContentResolver contentResolver = getContentResolver();
Uri uri = Uri.parse("content://www.baidu.com.cn" + "/update");
ContentValues values = new ContentValues();
values.put("tel", "120");
String where = "name=?";
String[] selectionArgs = { "赵六" };
int update = contentResolver.update(uri, values, where, selectionArgs);
System.out.println("update:" + update);
}
public void button_select(View v) {
ContentResolver contentResolver = getContentResolver();
Uri uri = Uri.parse("content://www.baidu.com.cn" + "/query");
String[] progection = { "name", "tel", "deadTime" };
String selection = "name=?";
String[] selectionArgs = { "赵六" };
Cursor cursor = contentResolver.query(uri, progection, selection,
selectionArgs, null);
if (cursor != null && cursor.getCount() > 0) {
while (cursor.moveToNext()) {
String name = cursor.getString(0);
String tel = cursor.getString(1);
String deadTime = cursor.getString(2);
System.out.println(name + ":" + tel + ":" + deadTime);
}
}
}
ContentResolver获取系统共享信息
用ContentResolver还可以获取系统共享的数据,如:短信,信息。 public void button_555(View v) {
ContentResolver contentResolver = getContentResolver();
Uri uri = Uri.parse("content://sms" + "/");
String[] progection = { "address", "body" };
Cursor cursor = contentResolver
.query(uri, progection, null, null, null);
if (cursor != null && cursor.getCount() > 0) {
while (cursor.moveToNext()) {
String address = cursor.getString(0);
String body = cursor.getString(1);
System.out.println(address + ":" + body);
}
}
}