内容提供者简介
内容提供者(ContentProvider)是Android系统四大组件之一,它是不同应用程序之间进行数据共享的标准API,通过ContentResolver类可以访问ContentProvider中共享的数据。
ContentProvider的工作原理如下:
ContentResolver提供一系列增删改查的方法对数据进行操作,并且这些方法以Uri的形式对外提供数据。
Uri为内容提供者中的数据建立了唯一标识符。它主要由三部分组成,scheme、authorities和path。
内容提供者的创建
在程序包名处点击右键选择【New】—【Other】—【Content Provider】选项
输入内容提供者的Class Name(名称)和URI Authorities(唯一标识,通常使用包名)
内容提供者创建完成后,Android Studio会自动在AndroidManifest.xml中对内容提供者进行注册。
<application ......>
......
<provider
android:name=".MyContentProvider"
android:authorities="cn.itcast.mycontentprovider"
android:enabled="true"
android:exported="true" >
</provider>
</application>
访问内容提供者
内容观察者的使用
内容观察者(ContentObserver)是用来观察指定Uri
所代表的数据的,当ContentObserver
观察到指定Uri代表的数据发生变化时,就会触发onChange()
方法,在该方法中使用ContentResovler
可以查询到变化的数据。
要使用ContentObserver
观察数据变化,就必须在ContentProvider
的delete()
、insert()
、update()
方法中调用ContentResolver
的notifyChange()
方法。
ContentObserver的两个常用方法:
public void ContentObserver(Handler handler) : ContentObserver的派生类都需要调用该构造方法。参数可以是主线程Handler,也可以是任何Handler对象(Handler将在第9章讲解)。
public void onChange(boolean selfChange) : 当观察的Uri代表的数据发生变化时,会触发该方法。在该方法中使用ContentResovler可以查询到变化的数据。
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://aaa.bbb.ccc");
resolver.registerContentObserver(uri, true, new MyObserver(new Handler()));
private class MyObserver extends ContentObserver{
public MyObserver(Handler handler) {
super(handler);
}
public void onChange(boolean selfChange) {
super.onChange(selfChange);
Uri uri = Uri.parse("content://aaa.bbb.ccc");//会监测该Uri的数据变化情况
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(uri, new String[] {
"address", "date", "type", "body" }, null, null, null);
// ......
cursor.close();
}
}
案例:检测数据的猫
PersonDBOpenHelper 类:创建数据库和表
public class PersonDBOpenHelper extends SQLiteOpenHelper {
//构造方法,调用此方法新建一个person.db的数据库并返回一个数据库帮助类的对象
public PersonDBOpenHelper(Context context) {
super(context, "person.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
//创建该数据库的同时新建一个info表,表中有_id,name这两个字段
db.execSQL("create table info (_id integer primary key autoincrement, name varchar(20))");
}
@Override
public