本篇学习一下监听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); } } } }
运行后者在模拟器,然后打开前者,点击添加数据按钮,看到控制台日志输出信息如下:
作者:wulianghuan 发表于2013-5-7 22:24:14 原文链接
阅读:0 评论:0 查看评论