内容提供者contentprovider
1.为什么需要内容提供者?
以为直接访问数据库需要权限,而通过内容提供者我们可以把私有的数据库内容暴露出来.
2.内容提供者原理
由于数据库是私有的,外部应用不可以直接访问.在应用内部使用内容提供者,向外部暴露接口,这样外部应用可以借助“中间人”访问到内部的数据库.
3内容提供者的创建
(1)创建一个类继承ContentProvider,并在清单文件中注册,两个属性,name和authorities(组成uri路径的东西).
(2)创建一个UriMatcher(uri路径匹配器)
private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);
(3)定义一个static静态代码块,用来往uri路径匹配器中添加rui
static { // uri: authority/path =pers.wzs.provider/query
// authority:跟清单文件定义的一样即可
// path:随便写...
// code:
// 别的应用程序通过uri访问对应的方法,一个uri对应一个方法,code用于匹配验证
sURIMatcher.addURI("pers.wzs.provider", "query", QUERYSUCCESS);
}
(4)获取数据库对象,重写增删查改方法
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
int code = sURIMatcher.match(uri);
if (code == QUERYSUCCESS) {
// 说明路径匹配成功,调用query方法
SQLiteDatabase db = mySQLiteOpenHelper.getReadableDatabase();
Cursor cursor = db.query("info", projection, selection, selectionArgs, null, null, sortOrder);
// 小细节:★这个db和cursor不能关闭
return cursor;
} else {
// 路径不匹配
throw new IllegalArgumentException("哥们,uri路径不匹配,请检查路径");
}
}
查询方法中不可以关闭db.cursor游标对象
4.通过内容提供者进行数据库的增删查改操作
(1)创建uri路径
Uri uri = Uri.parse("content://authorities的值/path的值");
(2)获得内容解析者,进行操作
Cursor cursor = getContentResolver().query(uri, new String[]{"name","money"}, null, null, null);
短信备份例子:
通过内容解析者获取短信数据
Uri uri = Uri.parse("content://sms/");//authorities和path在系统源码中找,先看清单文件中provider,再找java文件中的UriMatcher匹配器,静态代码块中的uri
Cursor cursor = getContentResolver().query(uri, new String[]{"address","date","body"}, null, null, null);
联系人信息查询,插入例子:
表和表之间存在关系时....(数据库的知识忘得一干二净了),要查询联系人的data表获取信息,得先查出其外键raw_contact_id表中的contact_id的值.再根据contact_id值查询一个联系人信息
要插入联系人信息时,得先查询raw_contact_id表中数据数量,+1就是新添加的联系人信息的contact_id值,先往raw_contact_id表添加contact_id数据,才可以根据contact_id的值,往data表中添加data1属性数据.添加数据时mimetype类型属性得一起添加