内容提供者:ContentProvider

主要是用来暴漏自己应用的数据,供其他应用去使用

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);




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值