android 数据库怎么监听数据变化
2015-02-05 · 知道合伙人数码行家
知道合伙人数码行家
向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
广告 您可能关注的内容 |