Android学习笔记----利用ContentObserver监听数据库内容的改变

来源:互联网 发布:udp端口命令 编辑:程序博客网 时间:2024/05/22 13:12

/**********************************************************/

利用ContentProvider监听数据库内容的改变

监听ContentProvider所共享的内容的变化,并随着ContentProvider数据的改变提供相应的处理。


1,创建一个类,继承ContentObserver()
2,注册内容ContentObserver

getContentResolver().registerContentObserver(Uri uri,boolean notifyForDescendents,ContentObserver contentObserver)

uri:该监听器所监听的ContentProvider的uri

notifyForDescendents:如果该参数设置为true,假如监听器注册监听的Uri为content://abc,那么Uri为content://abc/xyz,content://abc/xyz/foo,的数据改变时也会触发监听器,如果该参数设置为false,假如监听器注册监听的Uri为content://abc,那么只有当content://abc的数据发生改变的时候才会触发该监听器。

contentObserver:监听器实例

package org.crazyit.content;import android.app.Activity;import android.database.ContentObserver;import android.database.Cursor;import android.net.Uri;import android.os.Bundle;import android.os.Handler;/** * Description: * <br/>site: <a href="http://www.crazyit.org">crazyit.org</a>* <br/>Copyright (C), 2001-2014, Yeeku.H.Lee * <br/>This program is protected by copyright laws. * <br/>Program Name: * <br/>Date: * @author  Yeeku.H.Lee kongyeeku@163.com * @version  1.0 */public class MonitorSms extends Activity{    @Override    public void onCreate(Bundle savedInstanceState)    {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        // 为content://sms的数据改变注册监听器        getContentResolver().registerContentObserver(Uri.parse("content://sms"),true,new SmsObserver(new Handler()));    }    // 提供自定义的ContentObserver监听器类    private final class SmsObserver extends ContentObserver    {        public SmsObserver(Handler handler)        {            super(handler);        }        public void onChange(boolean selfChange)        {            // 查询发送箱中的短信(处于正在发送状态的短信放在发送箱)            Cursor cursor = getContentResolver().query(Uri.parse("content://sms/outbox"), null, null, null, null);            // 遍历查询得到的结果集,即可获取用户正在发送的短信            while (cursor.moveToNext())            {                StringBuilder sb = new StringBuilder();                // 获取短信的发送地址                sb.append("address=").append(cursor.getString(cursor.getColumnIndex("address")));                // 获取短信的标题                sb.append(";subject=").append(cursor.getString(cursor.getColumnIndex("subject")));                // 获取短信的内容                sb.append(";body=").append(cursor.getString(cursor.getColumnIndex("body")));                // 获取短信的发送时间                sb.append(";time=").append(cursor .getLong(cursor.getColumnIndex("date")));                System.out.println("Has Sent SMS::" + sb.toString());            }        }    }}

使用自己定义的内容提供者的增删改查方法可以引起数据的改变,但如果想要触发内容观察者,需要在方法内部,加上getContext().getContentResolver().notifyChange(uri,null)方法

例:如果不知道怎么自定义内容提供者的话,可以翻看我的前一篇博客  Android学习笔记----自定义内容提供者

public class  MyContentResolver extends ContentResolver{              ...........................                                            @Override                public Uri insert(Uri uri,ContentValues values){                                              Uri uriReturn = null;                       SQLiteDatabase db  = myDbHelper.getWritableDatabase();                       switch(uriMarcher.,match()){                                case BOOK_DIR:                                break;                                case BOOK_ITEM:                                        long newId = db.insert("Book",null,values);                                        uriReturn = Uri.parse("content://"+AUTHORITY +"/book/"+newId);                                       <strong><span style="color:#ff6666;"> getContext().getContentResolver().notifyChange(uri,null)</span></strong>                                break;                                case  AUTHORDETAIL_DIR :                                break;                                case AUTHORDETAIL_ITEM:                                        long  newCateGoryId = db.insert("AuthorDetail",null,values);                                        uriReturn = Uri.parse("content://"+AUTHORITY+"/category/"+newCateGoryId);                                        <strong><span style="color:#ff6666;">getContext().getContentResolver().notifyChange(uri,null)</span></strong>                                break;                                default                                break;                          }                         return uriReturn ;                }                                       ...........................}

在一个活动的内部自定义内容观察者,然后注册内容观察者,当通过上述自定义的内容提供者的方法引起数据的改变的时候,就会触发注册的内容观察者,可以在注册的内容观察者里面做出对应的处理。



0 0