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:
 * <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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值