android 数据库怎么监听数据变化

 我来答
huanglenzhi
2015-02-05 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
采纳数:117538 获赞数:517203
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。

向TA提问 私信TA
展开全部

  在android中经常会用到改变数据库内容后再去使用数据库更新的内容,很多人会重新去query一遍,但是这样的问题就是程序会特别占内存,而且有可能会搂关cursor而导致程序内存未释放等等。其实android内部提供了一种ContentObserver的东西来监听数据库内容的变化。

  ContentObserver的构造函数需要一个参数Hanlder,因为ContentObserver内部使用了一个实现Runnable接口的内部类NotificationRunnable,来实现数据库内容的变化。需要使用hanlder去post消息。注册ContentObserver的方法是:getContentResolver().registerContentObserver(uri, notifyForDescendents, observer).

  上面3个参数为:uri----Uri类型,是需要监听的数据库的uri.

  notifyForDescendents---boolean  true的话就会监听所有与此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]

package ty.com.lto;    
02         
03    import android.app.Activity;    
04    import android.content.Intent;    
05    import android.database.ContentObserver;    
06    import android.os.Bundle;    
07    import android.os.Handler;    
08    import android.view.View;    
09    import android.widget.Button;    
10         
11    public class ListenDataTest extends Activity{    
12        private Button testBtn;    
13         
14            @Override    
15            protected void onCreate(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(new View.OnClickListener() {    
23                                 
24                            public void onClick(View v) {    
25                                    Intent in = newIntent(ListenDataTest.this,DataChangeTest.class);    
26                                    startActivity(in);    
27                                         
28                            }    
29                    });    
30                         
31            }    
32                 
33            private ContentObserver cob = new ContentObserver(new Handler()) {    
34         
35                    @Override    
36                    public boolean deliverSelfNotifications() {    
37                            return super.deliverSelfNotifications();    
38                    }    
39         
40                    @Override    
41                    public void onChange(boolean selfChange) {    
42                            super.onChange(selfChange);    
43                           testBtn.setText(DataUtils.getChangeName(getApplicationContext()));    
44                    }    
45                          
46             };    
47         
48            @Override    
49            protected void onDestroy() {    
50                    super.onDestroy();    
51                    getContentResolver().unregisterContentObserver(cob);    
52            }    
53              
54                  
55    }    
[code]01    package ty.com.lto;    
02         
03    import android.app.Activity;    
04    import android.content.ContentValues;    
05    import android.content.Intent;    
06    import android.database.ContentObservable;    
07    import android.database.ContentObserver;    
08    import android.os.Bundle;    
09    import android.os.Handler;    
10    import android.view.View;    
11    import android.widget.Button;    
12         
13    public class DataChangeTest extends Activity{    
14         private Button dataBtn;    
15         DataSqlite mDataSqlite;    
16         @Override    
17         protected void onCreate(Bundle savedInstanceState) {    
18            super.onCreate(savedInstanceState);    
19            setContentView(R.layout.data_change_test);    
20            dataBtn = (Button)findViewById(R.id.data_test_btn);    
21            mDataSqlite = new DataSqlite(this);    
22            dataBtn.setOnClickListener(new View.OnClickListener() {    
23                     
24                public void onClick(View v) {    
25                    ContentValues con = new ContentValues();    
26                    con.put("name", "数据变化了");    
27                    getContentResolver().insert(DataChangeProvider.CONTENT_URI, con);    
28                    finish();    
29                }    
30            });    
31         }    
32    }    
[code]view sourceprint?
001    package ty.com.lto;    
002          
003          
004    import android.content.ContentProvider;    
005    import android.content.ContentUris;    
006    import android.content.ContentValues;    
007    import android.content.Context;    
008    import android.content.UriMatcher;    
009    import android.database.Cursor;    
010    import android.database.SQLException;    
011    import android.database.sqlite.SQLiteDatabase;    
012    import android.database.sqlite.SQLiteOpenHelper;    
013    import android.database.sqlite.SQLiteQueryBuilder;    
014    import android.database.sqlite.SQLiteDatabase.CursorFactory;    
015    import android.net.Uri;    
016    import android.text.TextUtils;    
017          
018    public class DataChangeProvider extends ContentProvider{    
019        private SQLiteOpenHelper mOpenHelper;    
020        private static final int ALARMS = 1;    
021        private static final int ALARMS_ID = 2;    
022        private static final UriMatcher sURLMatcher = new UriMatcher(UriMatcher.NO_MATCH);    
023        public static final Uri CONTENT_URI = Uri.parse("content://ty.com.lto/test");    
024          
025        static {    
026            sURLMatcher.addURI("ty.com.lto", "test", ALARMS);    
027            sURLMatcher.addURI("ty.com.lto", "test/#", ALARMS_ID);    
028        }    
029             
030        private static class DatabaseHelper extends SQLiteOpenHelper{    
031             private static final String TEST_DATABASE = "test.db";    
032             private static final int VERSION = 1;    
033                  
034             public DatabaseHelper(Context context) {    
035                 super(context, TEST_DATABASE, null, VERSION);    
036                 // TODO Auto-generated constructor stub    
037             }    
038                   
039          
040             @Override    
041             public void onCreate(SQLiteDatabase db) {    
042                 String sql = "CREATE TABLE "+"test"+" (" +    
043                         "_id INTEGER PRIMARY KEY," +    
044                         "name TEXT "+    
045                          ");";    
046                 db.execSQL(sql);    
047             }    
048          
049             @Override    
050             public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {    
051                 String sql = "DROP TABLE IF EXIST "+TEST_DATABASE;    
052                 db.execSQL(sql);    
053                 onCreate(db);    
054             }    
055                  
056        }    
057             
058        public DataChangeProvider() {    
059        }    
060             
061        @Override    
062        public int delete(Uri url, String where, String[] whereArgs) {    
063            SQLiteDatabase db = mOpenHelper.getWritableDatabase();    
064            int count;    
065            long rowId = 0;    
066            switch (sURLMatcher.match(url)) {    
067                case ALARMS:    
068                    count = db.delete("test", where, whereArgs);    
069                    break;    
070                case ALARMS_ID:    
071                    String segment = url.getPathSegments().get(1);    
072
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式