作用:对外共享数据,通过Content Provider把应用中数据共享给其他应用访问,其他应用通过Content Provider对应用中得数据进行添删改查。
好处:Content Provider对外共享数据的好处是统一数据的访问方式。
步骤例子:
(1)继承ContentProvider类,重写方法:
public class PersonContentProvider extends ContentProvider{
//该方法在ContentProvider创建后就会被调用, Android开机后, ContentProvider在其它应用第一次访问它时才会被创建。
public boolean onCreate()
//该方法用于供外部应用往ContentProvider添加数据。
public Uri insert(Uri uri, ContentValues values)
//该方法用于供外部应用从ContentProvider删除数据。
public int delete(Uri uri, String selection, String[] selectionArgs)
//该方法用于供外部应用更新ContentProvider中的数据。
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
//该方法用于供外部应用从ContentProvider中获取数据。
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
//该方法用于返回当前Url所代表数据的MIME类型。
//(如果操作的数据属于集合类型,MIME类型以vnd.android.cursor.dir/开头)
//(如果操作的数据属于非集合类型数据,MIME类型以vnd.android.cursor.item/开头)
public String getType(Uri uri)
}
(2)在AndroidMainifest.xml中进行配置:
ContentProvider 采用了authorities(主机名/域名)对它进行唯一标识,可以把 ContentProvider看作是一个网站,authorities 就是他的域名:
<manifest .... >
<application android:icon="@drawable/icon" android:label="@string/app_name">
<provider android:name=".PersonContentProvider" android:authorities="com.qgmobile.providers.personprovider"/>
</application>
</manifest>
ContentResolver :
当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver 类来完成,要获取ContentResolver 对象,可以使用Activity提供的getContentResolver()方法。 ContentResolver 类提供了与ContentProvider类相同签名的四个方法(insert、delete、update、query)。
例子:(使用ContentResolver对ContentProvider中的数据进行添加、删除、修改和查询操作)
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person");
//添加一条记录
ContentValues values = new ContentValues();
values.put("name", "CongHua");
values.put("age", 20);
resolver.insert(uri, values);
//获取person表中所有记录
Cursor cursor = resolver.query(uri, null, null, null, "personid desc");
while(cursor.moveToNext()){
Log.i("ContentTest", "personid="+ cursor.getInt(0)+ ",name="+ cursor.getString(1));
}
//把id为1的记录的name字段值更改新为liming
ContentValues updateValues = new ContentValues();
updateValues.put("name", "qgmobile");
Uri updateIdUri = ContentUris.withAppendedId(uri, 2);
resolver.update(updateIdUri, updateValues, null, null);
//删除id为2的记录
Uri deleteIdUri = ContentUris.withAppendedId(uri, 2);
resolver.delete(deleteIdUri, null, null);
监听ContentProvider中数据的变化:
(1)如果ContentProvider的访问者要知道ContentPrivider的变化,可以在ContentProvider发生变化时调用getContentResolver().notifyChange(uri,null)来通知注册此Uri上的访问者。
例子:
public class PersonContentProvider extends ContentProvider {
public Uri insert(Uri uri, ContentValues values) {
db.insert("person", "personid", values);
getContext().getContentResolver().notifyChange(uri, null);
}
}
(2)如果ContentProvider的访问者需要得到数据变化通知,必须使用ContentObserver对数据(数据采用uri描述)进行监听,当监听到数据变化通知时,系统就会调用ContentObserver的onChange()方法。
例子:
getContentResolver().registerContentObserver(Uri.parse("content://cn.itcast.providers.personprovider/person"),true, new PersonObserver(new Handler()));
public class PersonObserver extends ContentObserver{
public PersonObserver(Handler handler) {
super(handler);
}
public void onChange(boolean selfChange) {
//此处可以进行相应的业务处理
}
}