主要是用来暴漏自己应用的数据,供其他应用去使用
1.自定义内容提供者,继承ContentProvider类,重写增删改查方法,在方法中写增删改查数据库的代码
@Override
public Uri insert(Uri uri, ContentValues values) {
db.insert("person", null, values);
return uri;
}
2.在清单文件中定义内容提供者的标签,注意必须要有authorities属性,这是内容提供者的主机名,功能类似地址,exported也一定要加上,否则无法操作,之前默认不加也可以,4.0之后默认不加无法操作
<provider android:name="com.itheima.contentprovider.PersonProvider"
android:authorities="com.my.person"
android:exported="true"
></provider>
3.创建一个其他应用,访问自定义的内容提供者,实现对数据库的插入操作
public void click(View v){
//得到内容分解器对象
ContentResolver cr = getContentResolver();
ContentValues cv = new ContentValues();
cv.put("name", "小");
cv.put("phone", 1111116);
cv.put("money", 3000);
//url:内容提供者的主机名
cr.insert(Uri.parse("content://com.my.person"), cv);
}
4.以上方式对于只有一个数据库表person时适用,当有多个表示需要用UriMatcher来进行uri的匹配,#表示后面可以添加任何数字
//创建uri匹配器对象
static UriMatcher um = new UriMatcher(UriMatcher.NO_MATCH);
//检测其他用户传入的uri与匹配器定义好的uri中,哪条匹配
static {
um.addURI("com.my.people", "person", 1);//content://com.my.people/person
um.addURI("com.<span style="font-family: Arial, Helvetica, sans-serif;">my</span><span style="font-family: Arial, Helvetica, sans-serif;">.people", "teacher", 2);//content://com.my.people/teacher</span>
um.addURI("com.my.people", "person/#", 3);//content://com.my.people/person/4
}
相应的各增删改查也要修改:
//此方法供其他应用调用,用于往people数据库里插数据
//values:由其他应用传入,用于封装要插入的数据
//uri:内容提供者的主机名,也就是地址
@Override
public Uri insert(Uri uri, ContentValues values) {
//使用uri匹配器匹配传入的uri
if(um.match(uri) == 1){
db.insert("person", null, values);
//发送数据改变的通知
//uri:通知发送到哪一个uri上,所有注册在这个uri上的内容观察者都可以收到这个通知
getContext().getContentResolver().notifyChange(uri, null);
}
else if(um.match(uri) == 2){
db.insert("teacher", null, values);
getContext().getContentResolver().notifyChange(uri, null);
}
else{
throw new IllegalArgumentException("uri有问题");
}
return uri;
}
如果路径中带有数字,把数字提取出来的api
int id = (int) ContentUris.parseId(uri);
5.内容观察者(有点类似广播):当数据库数据改变时,内容提供者会发出通知,在内容提供者的uri上注册一个内容观察者,就可以收到数据改变的通知
cr.registerContentObserver(Uri.parse("content://sms"), true, new MyObserver(new Handler()));
class MyObserver extends ContentObserver{
public MyObserver(Handler handler) {
super(handler);
// TODO Auto-generated constructor stub
}
//内容观察者收到数据库发生改变的通知时,会调用此方法
@Override
public void onChange(boolean selfChange) {
}
}
在内容提供者中发通知的代码
ContentResolver cr = getContext().getContentResolver();
//发出通知,所有注册在这个uri上的内容观察者都可以收到通知
cr.notifyChange(uri, null);