android 使用contentobserver监听数据库内容变化

android 使用contentobserver监听数据库内容变化

在android中经常会用到改变数据库内容后再去使用数据库更新的内容,很多人会重新去query一遍,但是这样的问题就是程序会特别占内存,而且有可能会搂关cursor而导致程序内存未释放等等。其实android内部提供了一种ContentObserver的东西来监听数据库内容的变化。
ContentObserver的构造函数需要一个参数Hanlder,因为ContentObserver内部使用了一个实现Runnable接口的内部类NotificationRunnable,来实现数据库内容的变化。需要使用hanlder去post消息。注册ContentObserver的方法是:getContentResolver().registerContentObserver(uri, notifyForDescendents, observer).
上面3个参数为:uri----Uri类型,是需要监听的数据库的uri.
notifyForDescendents---booleantrue的话就会监听所有与此uri相关的uri。false的话则是直接特殊的uri才会监听。一般都设置为true.
observer-----ContentObserver就是需要的contentobserver.
初始化一个ContentObserver对象,重载onChange(boolean ),在这个方法里去操作数据库的使用,针对变化后的使用。
写了一个小demo,可以参考下。提示这种监听方式必须是contentprovider才能使用,因为contentprovider有uri.简单的那种sqlite数据库没有uri是使用不了的。
下面demo操作的是在一个activityA里点击button跳转至另外一个activityB,在B中点击button往数据库中加数据,加完后关闭B回到A。A的button的文字自动变化设置到数据库中的字符串。[code]
01 packagety.com.lto;
02
03 importandroid.app.Activity;
04 importandroid.content.Intent;
05 importandroid.database.ContentObserver;
06 importandroid.os.Bundle;
07 importandroid.os.Handler;
08 importandroid.view.View;
09 importandroid.widget.Button;
10
11 publicclassListenDataTestextendsActivity{
12 privateButton testBtn;
13
14 @Override
15 protectedvoidonCreate(Bundle savedInstanceState) {
16 super.onCreate(savedInstanceState);
17 setContentView(R.layout.listen_data_test);
18 getContentResolver().registerContentObserver(DataChangeProvider.CONTENT_URI,
19 true, cob);
20
21 testBtn = (Button)findViewById(R.id.test_btn);
22 testBtn.setOnClickListener(newView.OnClickListener() {
23
24 publicvoidonClick(View v) {
25 Intent in =newIntent(ListenDataTest.this,DataChangeTest.class);
26 startActivity(in);
27
28 }
29 });
30
31 }
32
33 privateContentObserver cob =newContentObserver(newHandler()) {
34
35 @Override
36 publicbooleandeliverSelfNotifications() {
37 returnsuper.deliverSelfNotifications();
38 }
39
40 @Override
41 publicvoidonChange(booleanselfChange) {
42 super.onChange(selfChange);
43 testBtn.setText(DataUtils.getChangeName(getApplicationContext()));
44 }
45
46 };
47
48 @Override
49 protectedvoidonDestroy() {
50 super.onDestroy();
51 getContentResolver().unregisterContentObserver(cob);
52 }
53
54
55 }
[code]
01 packagety.com.lto;
02
03 importandroid.app.Activity;
04 importandroid.content.ContentValues;
05 importandroid.content.Intent;
06 importandroid.database.ContentObservable;
07 importandroid.database.ContentObserver;
08 importandroid.os.Bundle;
09 importandroid.os.Handler;
10 importandroid.view.View;
11 importandroid.widget.Button;
12
13 publicclassDataChangeTestextendsActivity{
14 privateButton dataBtn;
15 DataSqlite mDataSqlite;
16 @Override
17 protectedvoidonCreate(Bundle savedInstanceState) {
18 super.onCreate(savedInstanceState);
19 setContentView(R.layout.data_change_test);
20 dataBtn = (Button)findViewById(R.id.data_test_btn);
21 mDataSqlite =newDataSqlite(this);
22 dataBtn.setOnClickListener(newView.OnClickListener() {
23
24

更多相关文章

  1. Android读取assets目录下文件数据内容
  2. [置顶] [小代码]连接MySQL数据库(android,php,MySQL)
  3. 【转载】Android数据库事务浅析
  4. Android创建和使用数据库详…
  5. 【Android 开发】:数据存储之 SQLite 数据库操作(一)
  6. Android程序架构基本内容概述
  7. Android数据库编程教程

随机推荐

  1. Android(安卓)ApiDemo学习——主Activity
  2. Android周报第二十三期
  3. 第二章 Android内核和驱动程序(转)
  4. Tinker详解 -- 微信Android(安卓)热补丁
  5. 在android中使用逐帧动画实现自定义progr
  6. Android开发笔记之 配置并使用Android支
  7. Android应用程序获得系统权限
  8. 《Android/OPhone 开发完全讲义》已出版,
  9. Android(安卓)4.0 SDK 环境搭建体验(Windo
  10. Android消息机制的Handler