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

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

利用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:
 * 
site: crazyit.org *
Copyright (C), 2001-2014, Yeeku.H.Lee *
This program is protected by copyright laws. *
Program Name: *
Date: * @author Yeeku.H.Lee [email protected] * @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);
                                        getContext().getContentResolver().notifyChange(uri,null)
                                break;
                                case  AUTHORDETAIL_DIR :
                                break;
                                case AUTHORDETAIL_ITEM:
                                        long  newCateGoryId = db.insert("AuthorDetail",null,values);
                                        uriReturn = Uri.parse("content://"+AUTHORITY+"/category/"+newCateGoryId);
                                        getContext().getContentResolver().notifyChange(uri,null)
                                break;
                                default
                                break;

                          }
                         return uriReturn ;
                }
            
             
              ...........................

}

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



你可能感兴趣的:(Android基础)