如果内容提供者数据发生了变化,监听器立刻就能收到对数据库操作的记录,而监听器是采用通知的机制,如果不采用通知的机制也可以做,那就是不断的查询数据库,这样的话效率就会很低。而采用通知机制的话,当用户向数据库发送一条记录,ContentObserver立刻就能获取到,我们就可以进行处理数据。
(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)); } } } }
原型:public final void registerContentObserver(Uri uri, booleannotifyForDescendents, ContentObserver observer)
notifyForDescendents:为false表示精确匹配,即只匹配该Uri;为true表示可以同时匹配其派生的Uri。
public voidContentObserver(Handler handler)
说明:所有ContentObserver的派生类都需要调用该构造方法。
onChange(booleanselfChange, Uri uri)或onChange(boolean selfChange)
当观察到的Uri发生变化时,回调该方法去处理。所有ContentObserver的派生类都需要Override(重写/覆盖)该方法去处理逻辑。