终于到最后一个了。
ContentProvider
Xmind
简单介绍一下ContentProvider
- 作为四大组件之一的内容提供者,作用与好处也十分明显,他同一了对外共享数据的访问方式。
- 在另一个应用能够通过ContentProvider对共享出数据的内容提供应用里的数据进行增删改查。
内容提供方
创建类继承ContentProvider并覆写其方法:
public class TestContentProvider extends ContentProvider { @Override public boolean onCreate() { return false; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { return null; } @Override public String getType(Uri uri) { return null; } @Override public Uri insert(Uri uri, ContentValues values) { return null; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { return 0; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { return 0; } }
然后在AndroidManif.xml中添加配置TestContentProvider:
<provider android:name=".TestContentProvider" android:authorities="com.xblydxj.provider.testprovider"/>
Uri
Uri代表了要操作的数据
- 主要包含两部分信息:
- 需要操作的ContentProvider。
- 对ContentProvider中的什么数据进行操作。
- 组成:
具体的介绍在Xmind里已经描述了。 UriMatcher类
为了解析Uri,从Uri中获取数据,android提供了两个用于操作Uri的工具类UriMatcher类用于匹配Uri:
String uri = "content://com.xblydxj.provider.testprovider/data/5"; UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH); matcher.addURI(AUTHORITY, "data/insert", 1); matcher.addURI(AUTHORITY, "data/delete", 2); switch(matcher.match(Uri.parse(uri))){ case 1: break; case 2: break; default: break; }
UriMatcher.No_MATCH表示不匹配任何路径的返回码,default设置为不匹配的选择。
ContentUris类用于操作Uri路径后面的Id部分:
withAppendedId(uri,id)方法,为path添加id
Uri uri = Uri.parse("content://com.xblydxj.provider.testprovider/data/5"); Uri resultUri = ContentUris.withAppendedId(uri,5);
parseId(uri)用于从path中获取id:
Uri uri = Uri.parse("content://com.xblydxj.provider.testprovider/data/5") long personid = ContentUris.parseId(uri);
- 主要包含两部分信息:
ContentResolver
当内容提供者应用为外部应用提供了数据之后,外部应用可以使用Activity的getContentResolver方法获取ContentResolver用于对内容提供者应用进行增删改查操作。创建ContentResolver对象
ContentResolver resolver = getContentResolver();
添加,先获取其参数
Uri uri = Uri.parse("content://com.xblydxj.provider.testprovider/data/5"); ContentValues values = new ContentValues(); values.put("_id", 1); values.put("name", "xblydxj"); values.put("age", 24); resolver.insert(uri, values);
查询data表记录
Cursor cursor = resolver.query(uri, null, null, null, "data _id desc"); while(cursor.moveToNext()){ Lot.d("tag", "data:[id="+cursor.getInt(0)+",name="+cursor.getString(1)+",age="+cursor.getInt(2)+"]"); }
修改表
ContentValues updateValues = new ContentValues(); updateValues.put("name", "xzy"); Uri updateUri = ContentUris.withAppendedId(uri, 3); resolver.update(updateIdUri, updateValues, null, null);
删除表
Uri deleteIdUri = ContentUri.withAppendedId(uri, 2); resolver.delete(deleteUri,null,null);
- 在ContentProvider的访问者需要知道ContentProvider中的数据发生变化,可以使用以下方法:
public class PersonContentProvider extends ContentProvider { public Uri insert(Uri uri, ContentValues values) { db.insert("data", "_id", values); getContext().getContentResolver().notifyChange(uri, null); } }
ContentObserver
上述方法是提供者应用提供给访问者得到数据变化的通知,而本方法用于访问者得到数据变化的通知:getContentResolver().registerContentObserver(Uri.parse("content://com.xblydxj.provider.testprovider/data"), true, new Observer(new Handler())); public class Observer extends ContentObserver{ public Observer(Handler handler) { super(handler); } public void onChange(boolean selfChange) { //。。。 } }
内容提供者我也没学好,这次的复习也就多写点了
未完待续。。。