ContentObserver

1、ContentObserver目的

如果内容提供者数据发生了变化,监听器立刻就能收到对数据库操作的记录,而监听器是采用通知的机制,如果不采用通知的机制也可以做,那就是不断的查询数据库,这样的话效率就会很低。而采用通知机制的话,当用户向数据库发送一条记录,ContentObserver立刻就能获取到,我们就可以进行处理数据。

2、监听ContentProvider数据变化的demo

(1)在内容提供者中当数据发生变化时通知其他程序进行监听

通过Context的getContentResolver()方法获取ContentResolver。

调用其notifyChange()方法发送数据修改通知。

(2)在其他程序中可以通过ContentObserver监听数据变化

通过Context的getContentResolver()方法获取ContentResolver。

调用其registerContentObserver()方法指定对某个Uri注册ContentObserver。

自定义ContentObserver,重写onChange()方法获取数据。

(3)demo

(a)在用户插入数据的时候通知其他程序进行监听。

public Uri insert(Uri uri, ContentValues values) {
	SQLiteDatabase db = helper.getWritableDatabase();
	switch (matcher.match(uri)) {
		case PERSON_ALL:
			long id = db.insert("person", "id", values);
			// 监听通知
			getContext().getContentResolver().notifyChange(uri, null);
			return ContentUris.withAppendedId(uri, id);
		default:
			throw new IllegalArgumentException("Unmatch Uri: " + uri);
	}
}

(b)在另外一个工程中进行监听,一旦用户进行插入操作,就可以自动获取到用户插入的记录。

public class MainActivity extends Activity {
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
getContentResolver().registerContentObserver(Uri.parse("content://cn.itcast.provider.itcast/person"), true, new MyObserver(new Handler()));
	}

	class MyObserver extends ContentObserver {
		public MyObserver(Handler handler) {
			super(handler);
		}
        //当监听到数据发生了变化就调用这个方法,并将新添加的数据查询出来
		@Override
		public void onChange(boolean selfChange) {
			ContentResolver resolver = getContentResolver();
			Uri uri = Uri.parse("content://cn.itcast.provider.itcast/person");
			Cursor cursor = resolver.query(uri, new String[] { "id", "name", "phone", "balance" }, null, null, "id DESC LIMIT 1");
			while (cursor.moveToNext()) {
				System.out.print(cursor.getString(0) + " ");
				System.out.print(cursor.getString(1) + " ");
				System.out.print(cursor.getString(2) + " ");
				System.out.println(cursor.getString(3));
			}
		}
	}
}

3、registerContentObserver

原型:public final void registerContentObserver(Uri uri, booleannotifyForDescendents, ContentObserver observer)

notifyForDescendents:为false表示精确匹配,即只匹配该Uri;为true表示可以同时匹配其派生的Uri

4、ContentObserver的construct方法

public voidContentObserver(Handler handler)  

说明:所有ContentObserver的派生类都需要调用该构造方法。

5、ContentObserver的onChange方法

onChange(booleanselfChange, Uri uri)或onChange(boolean selfChange)

当观察到的Uri发生变化时,回调该方法去处理。所有ContentObserver的派生类都需要Override(重写/覆盖)该方法去处理逻辑。



你可能感兴趣的:(ContentObserver)