本篇学习一下监听ContentProvider的数据变化:
如果ContentProvider的访问者需要知道ContentProvider中的数据发生变化,可以在ContentProvider发生数据变化时调用getContentResolver().notifyChange(uri,null)来通知注册在此URI上的访问者,如果ContentProvider的访问者需要得到数据变化通知,必须使用ContentObserver对数据进行监听,当监听到数据变化通知时,系统就会调用ContentObserver的onChange()方法。
来看一个实例,一个是上篇中project:Android_ContentProvider,一个是新建的Android_ContentProvider_Observer。
前者依然是作为提供者,后者作为访问者,
一、在Android_ContentProvider的基础上添加代码
main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="往内容提供者添加一条记录"
android:onClick="insert"/>
</LinearLayout>
MainActivity.java:
package com.wujay.provider.ui;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import com.wujay.provider.R;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public void insert(View v){
Uri uri = Uri.parse("content://com.wujay.providers.personprovider/person");
ContentResolver resolver = this.getContentResolver();
ContentValues values = new ContentValues();
values.put("name", "insertName");
values.put("phone", "1802332877");
values.put("amount", "180000");
resolver.insert(uri, values);
}
}
在PersonProvider.java中的insert()方法中添加数据变化通知:
/*
* 插入数据
*/
@Override
public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
switch (MATCHER.match(uri)) {
case 1:
long rowId = db.insert("person", "name", values);
Uri insertUri = ContentUris.withAppendedId(uri, rowId);
//新增代码
this.getContext().getContentResolver().notifyChange(uri, null); //发出数据变化通知
break;
default:
throw new IllegalArgumentException("this is a unknown URI:"+uri);
}
return null;
}
二、Android_ContentProvider_Observer项目:
目录结构
MainActivity.java:
package com.observer.activity;
import android.app.Activity;
import android.database.ContentObservable;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Uri uri = Uri.parse("content://com.wujay.providers.personprovider/person");
//注册监听对象
this.getContentResolver().registerContentObserver(uri, true, new PersonContentObser(new Handler()));
}
private class PersonContentObser extends ContentObserver{
public PersonContentObser(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange) {
Uri uri = Uri.parse("content://com.wujay.providers.personprovider/person");
Cursor c = getContentResolver().query(uri, null, null, null, "personId desc limit 1");
if(c.moveToFirst()){
String name = c.getString(c.getColumnIndex("name"));
Log.i("MainActivity", "name:"+name);
}
}
}
}
运行后者在模拟器,然后打开前者,点击添加数据按钮,看到控制台日志输出信息如下: