Android_ContentProvider详解(实现增删改查)

来源:互联网 发布:linux查看系统版本位数 编辑:程序博客网 时间:2024/06/18 10:08

1.概述

ContentProvider为存储和读取数据提供了统一的接口,实现了程序间的数据共享,而应用程序内部没有必要实现这个功能,直接操作数据库就可以!Android内置的许多数据都是使用ContentProvider形式,供开发者调用的(如视频,音频,图片,通讯录等)。
当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据,统一了数据访问方式。

2.提供一个ContentProvider

/* * PersonProvider.java * 内容提供者 */public class PersonProvider extends ContentProvider {private SQLiteDatabase db;//需要操作的数据库private final static int PERSON = 1;private final static int PERSONID = 2;private final static int DELPERSONID = 3;private final static int PERSONS = 4;//1.定义一个静态常量字段Uri匹配器,用以匹配uriprivate final static UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH);//如果都匹配不成功,则返回构造函数中指定的参数值,默认为-1//2.静态代码块static{/* * Add a URI to match, and the code to return when this URI is matched.  * 使用"*"去匹配任意的文本数据,或者使用"#"去匹配任意的数字 * MATCHER.addURI(String authority, //主机名或者认证 com.baidu.provider.person * String path, //路径 authority/path * int code)//与这个authority的path路径想对应的,一个int的数字,使用MATCHER.match(uri) 返回code数字 */MATCHER.addURI("com.baidu.provider.person", "person", PERSON);//MATCHER.addURI("com.baidu.provider.person", "persons", PERSONS);MATCHER.addURI("com.baidu.provider.person", "person/update/#", PERSONID);MATCHER.addURI("com.baidu.provider.person", "person/delete/#", DELPERSONID);}//3.onCreate方法完成provider的初始化动作,主要是数据库的构建@Overridepublic boolean onCreate() {DbOpenHelper dbOpenHelper = new DbOpenHelper(this.getContext());db = dbOpenHelper.getWritableDatabase();return true;}/* *4.覆写需要的方法 * query,insert,delete,update */@Overridepublic Uri insert(Uri uri, ContentValues values) {//4.1 使用uri匹配器去匹配一个uri,根据int返回值来判断具体的操作类型switch (MATCHER.match(uri)) {case PERSON://4.2与uri想匹配的响应操作long id = db.insert("person", "name", values);//返回iduri = ContentUris.withAppendedId(uri, id);//返回需求的uribreak;default:break;}return uri;}}
<!-- AndroidManifest.xml --><provider android:name=".PersonProvider" android:authorities="com.baidu.provider.person"></provider>

3.ContentProvider的增删改查

(1).增加操作

/* * ContentProvider 增操作 */// 提供者内部方法public Uri insert(Uri uri, ContentValues values) {switch (MATCHER.match(uri)) {case PERSON:long id = db.insert("person", "name", values);uri = ContentUris.withAppendedId(uri, id);//注意使用这个简便的操作方法,来生成一个uribreak;default:break;}return uri;}// 使用提供者的内部方法public void insertMethod(){ContentResolver resolver = MainActivity.this.getApplicationContext().getContentResolver();Uri uri = Uri.parse("content://com.baidu.provider.person/person");List<String> list = uri.getPathSegments();ContentValues values = new ContentValues();values.put("name", "zhang");values.put("age", "20");Uri resultUri = resolver.insert(uri, values);if(ContentUris.parseId(resultUri) > 0){//根据uri,解析出其中的id值show("插入成功!");}else{show("插入失败!");}}public void show(String info){Toast.makeText(this, info, Toast.LENGTH_SHORT).show();}

(2).删除操作

/* * ContentProvider 删操作 */// 提供者内部方法public int delete(Uri uri, String selection, String[] selectionArgs) {int resultId = 0;switch (MATCHER.match(uri)) {case DELPERSONID:long id = ContentUris.parseId(uri);//根据uri对象,解析出其中的id,解析失败返回为-1if(selection != null){selection += (" and _id="+id);}else{selection = ("_id="+id);}resultId = db.delete("person", selection, selectionArgs);//返回删除成功的行号值break;}return resultId;}//使用提供者的内部方法public void deleteMethod(){ContentResolver resolver = MainActivity.this.getApplicationContext().getContentResolver();Uri uri = Uri.parse("content://com.baidu.provider.person/person/delete/6");int id = resolver.delete(uri, null, null);if(id > 0){show("删除成功!");}else{show("删除失败!");}}public void show(String info){Toast.makeText(this, info, Toast.LENGTH_SHORT).show();}

(3).更新操作

/* * ContentProvider 更新操作 */// 提供者内部方法public int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {int resultId = 0;switch (MATCHER.match(uri)) {case PERSONID:long id = ContentUris.parseId(uri);if(selection != null){selection += (" and _id="+id);}else{selection = ("_id="+id);}resultId = db.update("person", values, selection, selectionArgs);break;default:break;}return resultId;}//使用提供者的内部方法public void updateMethod(){ContentResolver resolver = MainActivity.this.getApplicationContext().getContentResolver();Uri uri = Uri.parse("content://com.baidu.provider.person/person/update/5");ContentValues values = new ContentValues();values.put("name", "li");values.put("age", "24");int id = resolver.update(uri, values, null, null);if(id > 0){show("更新成功!");}else{show("更新失败!");}}public void show(String info){Toast.makeText(this, info, Toast.LENGTH_SHORT).show();}

(4).查询操作

/* * ContentProvider 查询操作 */// 提供者内部方法public Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {Cursor cursor = null;switch (MATCHER.match(uri)) {case PERSONS:cursor = db.query("person", projection, selection, selectionArgs, null, null, sortOrder);break;default:break;}return cursor;}//使用提供者的内部方法ContentResolver resolver = MainActivity.this.getApplicationContext().getContentResolver();Uri uri = Uri.parse("content://com.baidu.provider.persons");Cursor cursor = resolver.query(uri, null, null, null, null);if(cursor != null){list.setAdapter(new SimpleCursorAdapter(MainActivity.this, R.layout.item, cursor, new String[]{"_id", "name", "age"}, new int[]{R.id.id, R.id.name, R.id.age}));show("查询成功!");}else{show("查询失败!");}public void show(String info){Toast.makeText(this, info, Toast.LENGTH_SHORT).show();}

4.内容观察者

在listView中,使用内容提供者动态更新数据
ContentResolver resolver = getContentResolver();Uri uri = Uri.parse("content://sms/");resolver.registerContentObserver(uri, true, new ContentObserver(new Handler()) {@Overridepublic void onChange(boolean selfChange) {super.onChange(selfChange);/* * 发送一个Message对象 * 有handler对对象进行处理 */}});

5.操作示意图

                

原创粉丝点击