内容提供者简介
●内容提供者(ContentProvider) 是Android系统四大组件之一,用于保
存和检索数据,是Android系统中不同应用程序之间共享数据的接口。
●ContentProvider 是不同应用程序之间进行数据交换的标准API,以Uri形式对外提供数据,允许其他应用操作本应用数据。其他应用则使用ContentResolver,并根据ContentProvider提供的Uri操作指定数据。

创建一个内容提供者
步骤:
1.创建自定义类继承父类ContentProvider
2.重写抽象父类的方法
3.构建Uri解析器
4.添加构建访间uri:数据增删改查: api
5.注册内容提供者
public class MyProvider extends ContentProvider {
private DBHelper helper ;
private static UriMatcher uriMatcher=new Ur iMatcher CuriMatcher .NO_ MATCH);;
private static final String authority="com. provider";
private static final int QUERYSUCCESS=1;
private static final int UPDATESUCCESS=2;
private static final int INSERTSUCCESS=3;
private static final int DELETESUCCESS=4;
//zy. imau. edu .cn/path com.provider/query insert update
static {
uriMatcher . addURI (authority, "query" ,QUERYSUCCESS);
uriMatcher . addURI (authority ,"insert" ,INSERTSUCCESS);
uriMatcher . addURI (authority, "update" ,UPDATESUCCESS);
uriMatcher . addURI (authority, "delete" ,DELETESUCCESS);
//1次
@override
pub1ic boolean onCreate() {
helper=new DBHe lper (getContext());
return false;
}
@Nullable
@override
public Cursor query(@NonNull Uri uri, @Nu11ab1e String[] projection, @Nullable String
selection, @Nu11ab1e String[] selectionArgs, @Nullable string sortorder) {
//1.解析uri正确
int code=uriMatcher . match(url);
//2.判读是不是查询
if(code==QUERYSUCCESS){
//3. 操作数据
sQLiteDatabase db=helper . getReadableDatabaseO;
//不用关闭游标
Cursor cursor=
db. query(const.TABLE,projection,selection,selecti onargs , nu11 ,nu11 ,sortorder);
return cursor ;
return null;
}
@Nullable
@override
public string getType(@NonNull uri uri) {
return null;
}
@Nu11able
@override
pub1ic Uri insert (@NonNu11 uri uri, @Nu11ab1e Contentvalues values) {
return null;
}
@override
pub1ic int delete (@NonNull uri uri, @Nullable String selection, @Nullable String[]
selectionArgs) {
return 0
}
@override
pub1ic int update (@NonNu11 Uri uri, @Nullable ContentValues values, @Nullable string
selection, @Nullable String[] selectionArgs) {
return 0;
<provider
android:name="cn.itcast. db.PersonDBProvider"
android:authorities="cn.itcast.db. personprovider" >
</provider>
- 定义一个类继承android.content包下的ContentProvider类(抽象类)。子
类需要重写它的onCreate()、delete()、 getType()、 insert()、 query()、update()这几个抽象方法。 - ContentProvider是 四大组件之一一, 必须要在清单文件中注册
Uri简介
●ContentProvider的几个抽象方法, 这几个抽象方法中有-一个参数Uri, 它代表了数据的操作方法。Uri是 由scheme、authorites、 path三部分组成。

scheme:“content://” 是一个标准的前缀,表明这个数据被内容提供者所控制,它不会被修改;
authorities:“cn.itcast. db personprovider"是在清单文件中指定的
android:authorities属性值,该值必须唯一, 它表示了当前的内容提供者;
path:“/person" 代表资源(或者数据),当访问者需要操作不同数据时
这个部分是动态改变的
●Uri.parse(String str)方法是将字符串转化成Uri对象的。为了解析Uri对象,
Android系统提供了一个辅助工具类UriMatcher用于匹配Uri。
●UriMatcher中的常用方法如表所示:

ContentResolver的基本用法
●在Android系统中, ContentResolver充当着桥梁的角色。应用程序通过ContentProvider暴露自己的数据,通过ContentResolver对应用程序暴露的数据进行操作。
●通过ContentResovler对象实现数据的操作代码如下:
Uri uri = Uiparse("ntet/:/cn.itcast. db personprovider/person");
ContentResolver resolver = context,getContentResolver();
Cursor cursor = resolver,query(uni, new String() { "address","date","type","body" }, null, nill, nill);
while (cursor.moveToNext()) {
String address = cursor.getring(0);
}
cursor.close();
内容观察者(ContentObserver) 是用来观察指定Uri所代表的数据。当
ContentObserver观察到指定Uri代表的数据发生变化时,就会触发
ContentObserver的onChange()方法。此时在onChange()方法里使用
ContentResovler可以查询到变化的数据。

从图可以看出,使用ContentObserver观察A应用的数据时)首先要在A应
用的ContentProvider中调用ContentResolver的notifyChange()方法。调用
了这个方法之后当数据发生变化时,它就会向“消息中心”发送数据变化
的消息。然后C应用观察到消息中心”有数据变化时,就会触发
ContentObserver的onChange()方法。
ContentObserver的几个常用方法,如表所示。.


7万+

被折叠的 条评论
为什么被折叠?



