ContentProvider ,ContentObserver 和ContentResolver

来源:互联网 发布:linux系统u盘端口 编辑:程序博客网 时间:2024/05/18 15:29

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匹配器的时值默认是-1private final int Account = 1;private final int Account_Id=0;@Overridepublic boolean onCreate() {helper = new MyHelper(getContext());//Itheima是主机名,account是数据的名,Account是条件1//content://Itheima/account/idmatcher.addURI("Itheima", "account", Account); //如果传进来的uri后面所带的名表是account,哪匹配器是1matcher.addURI("Itheima", "account/#", Account_Id);//#号是通配符id,如果这uri有带id,哪就匹配器的值就是0return false;}@Overridepublic 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无法识别");}}@Overridepublic 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无法识别");}}@Overridepublic 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无法识别");}}@Overridepublic 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无法识别");}}@Overridepublic int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {MyHelper helper = new MyHelper(getContext());switch (matcher.match(uri)) {case Account_Id://这个是有ID的urilong 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
原创粉丝点击