ContentProvider ,ContentObserver 和ContentResolver

1ContentProvider 是共享数据

2ContentObserver是监听数据

3ContentObserver是解析数据

 这个是测试程序,是用来接收另一个程序的信息

public class TestContent extends AndroidTestCase{

	
	public void testInsert(){
		ContentResolver resolver = getContext().getContentResolver();
		Uri uri= Uri.parse("content://Itheima/account");
		ContentValues values = new ContentValues();
		values.put("name", "李仕保s");
		values.put("balance", 2000);
		System.out.println(resolver.insert(uri, values));
		
	}

	public void testDelete(){
		ContentResolver resolver = getContext().getContentResolver();
		Uri uri= Uri.parse("content://Itheima/account/12");
		resolver.delete(uri, null,null);//delete(uri, 条件,参数)
		
	}
	public void testUpdate(){
		
		ContentResolver rsolver = getContext().getContentResolver();
		Uri uri= Uri.parse("content://Itheima/account/13");
		ContentValues values = new ContentValues();
		values.put("name", "曾经");
		values.put("balance", 1222);
		rsolver.update(uri, values, null, null);
	}

	public void testFindByid(){
		ContentResolver resolver = getContext().getContentResolver();
		Uri uri= Uri.parse("content://Itheima/account/13");
		Cursor c= resolver.query(uri, null, null, null, null);
		while(c.moveToNext()){
			System.out.println("name"+c.getString(c.getColumnIndex("name"))+
					"balance"+c.getInt(c.getColumnIndex("balance")));
			
		}
		
	}
	public void testGetType(){
		System.out.println(Uri.parse("content://Itheima/account/13"));
		System.out.println(Uri.parse("content://Itheima/account/13"));
	}

}

 

这个是存数据的程序 ,是送到上面去的。


 

public class ItheimaProvider extends ContentProvider{

	private MyHelper helper;
	private UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);//创建这uri匹配器的时值默认是-1
	private final int Account = 1;
	private final int Account_Id=0;
	@Override
	public boolean onCreate() {
		helper = new MyHelper(getContext());
		//Itheima是主机名,account是数据的名,Account是条件1
		//content://Itheima/account/id
		matcher.addURI("Itheima", "account", Account); //如果传进来的uri后面所带的名表是account,哪匹配器是1
		matcher.addURI("Itheima", "account/#", Account_Id);//#号是通配符id,如果这uri有带id,哪就匹配器的值就是0
		return false;
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
		MyHelper helper= new MyHelper(getContext());
		SQLiteDatabase db = helper.getReadableDatabase();//这里用getWritableDatabase()也没有什么大问题。
		switch (matcher.match(uri)) {
		case Account_Id:
			long id = ContentUris.parseId(uri);
			selection="_id=?";
			selectionArgs=new String[]{id+""};
		case Account:
			//db.query( 表名, 列名, 条件, 参数, groupBy, having, orderBy);
			Cursor c = db.query("account", projection, selection, selectionArgs, null, null, sortOrder);
			return c;
		default:
			throw new IllegalArgumentException("URI无法识别");
		}
		
	}

	@Override
	public String getType(Uri uri) {
		switch (matcher.match(uri)) {		// 获取Uri的MimeType, text/html  text/css   格式
		case Account_Id:
			return "vnd.android.cursor.item"; //返回一条记录用这个标记
		case Account:
			return "vnd.android.cursor.dir";	//返回多条记录用这个标记
			default:
			throw new IllegalArgumentException("URI无法识别");	
		}
	}

	@Override
	public Uri insert(Uri uri, ContentValues values) {
		SQLiteDatabase db = helper.getWritableDatabase();
		switch (matcher.match(uri)) {
		case Account:
			long id  = db.insert("account", "_id", values);
			db.close();
			return ContentUris.withAppendedId(uri, id);

		default:
			throw new IllegalArgumentException("URI无法识别");
		
		}
		
	}

	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		SQLiteDatabase db = helper.getWritableDatabase();
		switch (matcher.match(uri)) {
		case Account_Id:
			long id = ContentUris.parseId(uri); 
			selection="_id=?";
			selectionArgs=new String[]{id+""};
		case Account:
			int count = db.delete("account", selection, selectionArgs);
			db.close();
			return count;
		default:
			throw new IllegalArgumentException("URI无法识别");
		}
	}

	@Override
	public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
		MyHelper helper = new MyHelper(getContext());
		switch (matcher.match(uri)) {
		case Account_Id://这个是有ID的uri
			long id = ContentUris.parseId(uri);
			selection="_id=?";
			selectionArgs=new String[]{id+""};
		case Account://这个是没有id的uri 
			SQLiteDatabase db = helper.getWritableDatabase();
			int count = db.update("account", values, selection, selectionArgs);
			getContext().getContentResolver().notifyChange(uri, null);	// 当数据改变时, 发送通知, 这时ContentObserver就会接收到
			db.close();
			return count;
		default:
			throw new IllegalArgumentException("URI无法识别");
		}
		
	}


}

清单文件也有注意

 <provider
            android:name="com.itheima.sqlite.provider.ItheimaProvider"
            android:authorities="ItheimaProvider"
            android:exported="true" />


这里是刷新页面

 // 注册一个ContentObserver(类似一个监听器), 其中需要实现onChange()方法, 在数据修改的时候, 会自动执行onChange()方法
        Uri uri = Uri.parse("content://ItheimaProvider");
		getContentResolver().registerContentObserver(uri , true, new MyObserver()); //这里的true是监听uri下所有的子路径,如果是假只会监听当前uri


 

private class MyObserver extends ContentObserver {
		public MyObserver() {
			super(new Handler());
		}
		public void onChange(boolean selfChange) {
			list = dao.queryPage(20, pageNum);		// 重新查询数据
			adapter.notifyDataSetChanged();			// 刷新ListView(把数据和ListView显示的内容同步)
		}
	}



 


 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值