
在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 tycomlto;02
03 import androidappActivity;
04 import androidcontentIntent;
05 import androiddatabaseContentObserver;
06 import androidosBundle;
07 import androidosHandler;
08 import androidviewView;
09 import androidwidgetButton;
10
11 public class ListenDataTest extends Activity{
12 private Button testBtn;
13
14 @Override
15 protected void onCreate(Bundle savedInstanceState) {
16 superonCreate(savedInstanceState);
17 setContentView(Rlayoutlisten_data_test);
18 getContentResolver()registerContentObserver(DataChangeProviderCONTENT_URI,
19 true, cob);
20
21 testBtn = (Button)findViewById(Ridtest_btn);
22 testBtnsetOnClickListener(new ViewOnClickListener() {
23
24 public void onClick(View v) {
25 Intent in = newIntent(ListenDataTestthis,DataChangeTestclass);
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 superdeliverSelfNotifications();
38 }
39
40 @Override
41 public void onChange(boolean selfChange) {
42 superonChange(selfChange);
43 testBtnsetText(DataUtilsgetChangeName(getApplicationContext()));
44 }
45
46 };
47
48 @Override
49 protected void onDestroy() {
50 superonDestroy();
51 getContentResolver()unregisterContentObserver(cob);
52 }
53
54
55 }
[code]01 package tycomlto;
02
03 import androidappActivity;
04 import androidcontentContentValues;
05 import androidcontentIntent;
06 import androiddatabaseContentObservable;
07 import androiddatabaseContentObserver;
08 import androidosBundle;
09 import androidosHandler;
10 import androidviewView;
11 import androidwidgetButton;
12
13 public class DataChangeTest extends Activity{
14 private Button dataBtn;
15 DataSqlite mDataSqlite;
16 @Override
17 protected void onCreate(Bundle savedInstanceState) {
18 superonCreate(savedInstanceState);
19 setContentView(Rlayoutdata_change_test);
20 dataBtn = (Button)findViewById(Riddata_test_btn);
21 mDataSqlite = new DataSqlite(this);
22 dataBtnsetOnClickListener(new ViewOnClickListener() {
23
24 public void onClick(View v) {
25 ContentValues con = new ContentValues();
26 conput("name", "数据变化了");
27 getContentResolver()insert(DataChangeProviderCONTENT_URI, con);
28 finish();
29 }
30 });
31 }
32 }
[code]view sourceprint
001 package tycomlto;
002
003
004 import androidcontentContentProvider;
005 import androidcontentContentUris;
006 import androidcontentContentValues;
007 import androidcontentContext;
008 import androidcontentUriMatcher;
009 import androiddatabaseCursor;
010 import androiddatabaseSQLException;
011 import androiddatabasesqliteSQLiteDatabase;
012 import androiddatabasesqliteSQLiteOpenHelper;
013 import androiddatabasesqliteSQLiteQueryBuilder;
014 import androiddatabasesqliteSQLiteDatabaseCursorFactory;
015 import androidnetUri;
016 import androidtextTextUtils;
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(UriMatcherNO_MATCH);
023 public static final Uri CONTENT_URI = Uriparse("content://tycomlto/test");
024
025 static {
026 sURLMatcheraddURI("tycomlto", "test", ALARMS);
027 sURLMatcheraddURI("tycomlto", "test/#", ALARMS_ID);
028 }
029
030 private static class DatabaseHelper extends SQLiteOpenHelper{
031 private static final String TEST_DATABASE = "testdb";
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 dbexecSQL(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 dbexecSQL(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 = mOpenHelpergetWritableDatabase();
064 int count;
065 long rowId = 0;
066 switch (sURLMatchermatch(url)) {
067 case ALARMS:
068 count = dbdelete("test", where, whereArgs);
069 break;
070 case ALARMS_ID:
071 String segment = urlgetPathSegments()get(1);
072
Oracle监听器listener是一个重要的数据库服务器组件,在整个Oracle体系结构中,扮演着重要的作用。
Listener主要负责下面方面功能:
1、 监听客户端请求
监听器运行在数据库服务器之上,与Oracle实例(可为多个)相关关联,是一个专门的进程process,在windows的服务项目或者Linux的运行进程列表中,都会看到对应的运行进程。Windows上名为TNSLSNR,Linux/Unix平台上是lsnrctl。
2、 为客户端请求分配Server Process
监听器只负责接听请求,之后将请求转接给Oracle Server Process。在Oracle的服务模式下,客户端进程是不允许直接 *** 作数据库实例和数据,而是通过一个服务进程Server Process(也称为影子进程)作为代理。
扩展资料:
安全审计:
长期以来,在保障业务连续性和性能的前提下,最大限度的保障数据库安全一直是数据库管理人员、安全管理人员孜孜不倦追求的安全目标。本文将主要介绍4种数据库安全审计技术,并建议优选网络监听方式。
数据库系统作为三大基础软件之一并不是在计算机诞生的时候就同时产生的,随着信息技术的发展,传统文件系统已经不能满足人们的需要,1961年,美国通用电气公司成功开发了世界上第一个数据库系统IDS(Integrated Data Store),奠定了数据库的基础。
数据库系统在企业管理等领域已经具有非常广泛的应用,如、账号管理、访问控制、安全审计、防病毒、评估加固等多个方面,常见的安全产品如UTM、入侵检测、漏洞扫描等产品为保障数据库系统的正常运行起到了重要作用。
参考资料来源:Oracle官网-Oracle listener
是的,StreamSets可以监听到MySQL的binlog中的表 *** 作,包括建表、修改表、删除表等。使用StreamSets的MySQL CDC(Change Data Capture)原生源(MySQL CDC Origin)可以从MySQL的binlog中捕获变更数据,并将其转换为数据流,以供下游处理或存储。通过配置MySQL CDC原生源的参数,可以选择需要监听的表和 *** 作类型。具体而言,可以设置要监听的MySQL实例、数据库、表、binlog文件、位置和 *** 作类型,如insert、update、delete等。
一、问题描述:
安装好ORACLE服务器端后,利用PL/SQL连数据,提示无监听程序。
二、解决步骤:
1检查防火墙。
将防火墙关闭。
2查看监听服务。
在管理工具->服务中查看监听服务是否已经启动,如果没有,请启动。
3查看注册表。
在HKEY_LOCAL_MACHINE->SYSTEM->CurrentControlSet->services中查看监听程序是否注册。
1)如果没有ImagePath字段,就手动添加这个字段,将TNSLSNREXE的路径添加进去。
我的是F:\app\Administrator\product\1120\dbhome_1\BIN\TNSLSNR。
2)如果整个监听程序都未注册,那么请重新配置监听服务。步骤如下:
<1>打开网络配置工具(Net Configuration Assistant)
<2>选择监听程序配置,点击下一步
<2>删除原有的监听配置,直接点下一步即可。如果没有删除选项则跳过此步进行第<3>步。
<3>添加监听程序,也是直接点击下一步即可。
<4>监听服务添加后,在管理工具->服务中查看监听服务,并重启该服务。
4查看客户端的tnsnamesora文件。
linux下可以用ipcs查看,windows下可以查看服务,也可以进到数据库里面看数据库当前状态 select status from v$instance,如果status = open 就说明oracle服务正常。
oracle数据库文件结构:
1、控制文件:存储实例、数据文件及日志文件等信息的二进制文件。alter system set control_files=“路径”。V$CONTROLFILE。
2、数据文件:存储数据,以dbf做后缀。一句话:一个表空间对多个数据文件,一个数据文件只对一个表空间。dba_data_files/v$datafile。
3、日志文件:即Redo Log Files和Archivelog Files。记录数据库修改信息。ALTER SYSTEM SWITCH LOGFILE; 。V$LOG。
4、参数文件:记录基本参数。spfile和pfile。
5、警告文件:show parameter background_dump_dest=使用共享服务器连接
6、跟踪文件:show parameter user_dump_dest=使用专用服务器连接
以上就是关于android 数据库怎么监听数据变化全部的内容,包括:android 数据库怎么监听数据变化、oracle 监听程序的作用、StreamSets 能监听到mysql的binlog中的表 *** 作吗(建表、修改表、删除表等)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)