ContentObserver 监听(监听自己数据库的变化)

来源:互联网 发布:下载苹果软件 编辑:程序博客网 时间:2024/06/14 12:05

在博文Android中的数据操作中我们写了SQLite的增删改查方法,现在我们将调用其中的insert方法来往数据库中增加几条数据并且显示在ListView中,方法很简单,增添完数据后,用query查询出所有数据作为ListView的数据源,然后创建适配器和ListView连接即可,略去不谈。此处我们想说的是,当数据加入ListView中之后,有外部程序使用了本程序的数据库(可以参考博文 ContentProvider 的创建以及增删改查操作(你想看的都在这里了))增删改数据,如何在ListView中实时更新,如何通知到本程序数据已经被更改

第一:在需要监视数据变化的活动窗口创建一个ContentObsever

新建MyContentObsever继承自ContentObsever,写构造函数,重写onChange()方法

 class MyContentObselver extends ContentObserver{        public MyContentObselver(Handler handler) {            super(handler);        }        @Override        public void onChange(boolean selfChange) {            super.onChange(selfChange);           Toast.makeText(MainListAcitvity.this, "Data changed!", Toast.LENGTH_LONG).show();        }    }

第二:注册

      

getContentResolver().registerContentObserver(uri,true,new MyContentObselver(new Handler()));
uri即是本程序中provider提供的,只写到content://authorities即可,true代表接收带path,id等等的uri

第三:需要在自己程序中继承自ContentProvider中的类的各个方法中写上通知改变

getContext().getContentResolver().notifyChange(uri,null);
此处的uri即是自己每个方法中所用的uri
至此,一个监听就已经实现
但,我们想在数据改变时,在ListView中直接体现出来,怎么办呢?
只须在onChange()方法中,重新再查一遍数据即可
 public void onChange(boolean selfChange) {            super.onChange(selfChange);            persons10 = dao5.queryAll();           list.setAdapter(new PersonAdapter(getApplicationContext(),persons10));            Toast.makeText(MainListAcitvity.this, "Data changed!", Toast.LENGTH_LONG).show();        }

上面涉及到的所有代码:
MainListActivity(显示列表并监听数据):
package com.example.administrator.sqliteexecsql;import android.database.ContentObserver;import android.net.Uri;import android.os.Handler;import android.support.v7.app.ActionBarActivity;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.widget.ListView;import android.widget.Toast;import java.util.List;public class MainListAcitvity extends ActionBarActivity {    ListView list;    PersonDao dao5;    List<Person> persons10;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main_list_acitvity);        dao5 = new PersonDao(getApplicationContext());       //获取数据源,设置监听器,将数据显示在ListView中       persons10 = dao5.queryAll();        list = (ListView)findViewById(R.id.listview);        list.setAdapter(new PersonAdapter(this, persons10));        Uri uri= Uri.parse("content://com.example.administrator.sqliteexecsql.provider");        //true表示有跟在Uri后面的参数也接收通知        getContentResolver().registerContentObserver(uri,true,new MyContentObselver(new Handler()));    }    class MyContentObselver extends ContentObserver{        public MyContentObselver(Handler handler) {            super(handler);        }        @Override        public void onChange(boolean selfChange) {            super.onChange(selfChange);            persons10 = dao5.queryAll();           list.setAdapter(new PersonAdapter(getApplicationContext(),persons10));            Toast.makeText(MainListAcitvity.this, "Data changed!", Toast.LENGTH_LONG).show();        }    }   }

DBContentProvider(本程序中继承自ContentProvider的类)在上篇博文中已经有所体现,主要是在insert(),delete()和update()方法中添加一行通知改变的代码
之后运行程序,在上篇博文中启动访问本程序的数据库的程序,增加一个,然后本程序列表中也将实时增加一条数据。
在下篇博文中,写一个短信监听小例子来具体讲解如何在程序中监听其他程序数据库的变化


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小学一年级上课不专心怎么办 5岁儿童不专心怎么办 小孩子做作业不专心怎么办 孩子做作业不专心怎么办 小孩学了就忘怎么办 小孩学过就忘了怎么办 做事老是注意力不集中怎么办 做事无法专注注意力不集中怎么办 幼儿园孩子上课不认真听讲怎么办 孩子在课间打闹家长应该怎么办 孩子打闹家长额钱怎么办 我又打孩子了怎么办 打排卵针不排卵怎么办 总是控制不住打骂孩子怎么办 叛逆期的孩子打骂妈妈怎么办 孩子屁股打青了怎么办 父亲把孩子屁股打流血怎么办 孩子屁股长了湿疹怎么办 宝宝发脾气摔东西躺地上怎么办 生气拿棍子打了孩子怎么办 小宝宝被蚊虫咬了怎么办 小宝宝被蚊子咬了怎么办 衣架打小孩淤青怎么办 1岁宝宝有痰咳嗽怎么办 1岁宝宝咳嗽有痰怎么办 孩子爱动手打家长怎么办 不小心有了孩子该怎么办 2岁多宝宝干咳怎么办 2岁宝宝咳嗽无痰怎么办 打了孩子后悔了怎么办 12小孩脾气很犟怎么办 被学生气着了怎么办 1岁宝宝轻微咳嗽怎么办 4岁宝宝突然呕吐怎么办 4岁儿童突然呕吐怎么办 四岁儿童90身高怎么办 24个月宝宝缺钙怎么办 狗狗总是要人陪着玩怎么办 成年了还是很皮怎么办 三岁儿子太调皮怎么办 10个月宝宝粘人怎么办