JDBC-слушатель не получает DatabaseChangeNotification для Android Studio - PullRequest
0 голосов
/ 16 мая 2018
import android.app.Activity;
import android.content.Intent;
import android.net.wifi.WifiManager;
import android.text.format.Formatter;
import android.util.Log;
import android.widget.Toast;

import com.example.app.itservice.ForgetPasswordActivity;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import oracle.jdbc.OracleConnection;
import oracle.jdbc.OracleDriver;
import oracle.jdbc.OracleStatement;
import oracle.jdbc.dcn.DatabaseChangeEvent;
import oracle.jdbc.dcn.DatabaseChangeListener;
import oracle.jdbc.dcn.DatabaseChangeRegistration;

import static android.content.Context.WIFI_SERVICE;

public class DBChangeNotification

{

   static final String USERNAME= "scott";
  static final String PASSWORD= "tiger";
  static String URL;



  public void run() throws SQLException

  {

  OracleConnection conn = connect();
   Properties prop = new Properties();



   prop.setProperty(OracleConnection.DCN_NOTIFY_ROWIDS,"true");
   prop.setProperty(OracleConnection.DCN_QUERY_CHANGE_NOTIFICATION,"true");


   DatabaseChangeRegistration dcr = conn.registerDatabaseChangeNotification(prop);

  try
   {


   DCNDemoListener list = new DCNDemoListener(this);
   dcr.addListener(list);


   Statement stmt = conn.createStatement();

   ((OracleStatement)stmt).setDatabaseChangeRegistration(dcr);
   ResultSet rs = stmt.executeQuery("select * from dept where deptno='45'");
  while (rs.next())

  {}

  String[] tableNames = dcr.getTables();
  for(int i=0;i<tableNames.length;i++)

  System.out.println(tableNames[i]+" is part of the registration.");
   rs.close();
   stmt.close();
   }

   catch(SQLException ex)

  {

   if(conn != null)

  conn.unregisterDatabaseChangeNotification(dcr);
  throw ex;
   }

   finally
   {

   try
   {

   // Note that we close the connection!
   conn.close();
   }

   catch(Exception innerex){ innerex.printStackTrace(); }

  }



   synchronized( this )

  {

   // The following code modifies the dept table and commits:
   try
   {

  OracleConnection conn2 = connect();
   conn2.setAutoCommit(false);
   Statement stmt2 = conn2.createStatement();
   stmt2.executeUpdate("insert into dept (deptno,dname) values ('45','cool dept')",
   Statement.RETURN_GENERATED_KEYS);
   ResultSet autoGeneratedKey = stmt2.getGeneratedKeys();
  if(autoGeneratedKey.next())

  System.out.println("inserted one row with ROWID="+autoGeneratedKey.getString(1));
   stmt2.executeUpdate("insert into dept (deptno,dname) values ('50','fun dept')",
   Statement.RETURN_GENERATED_KEYS);
   autoGeneratedKey = stmt2.getGeneratedKeys();
  if(autoGeneratedKey.next())

  System.out.println("inserted one row with ROWID="+autoGeneratedKey.getString(1));
   stmt2.close();
   conn2.commit();
   conn2.close();
   }

   catch(SQLException ex) { ex.printStackTrace(); }



   // wait until we get the event
   try{ this.wait();} catch( InterruptedException ie ) {}

  }



   OracleConnection conn3 = connect();
   conn3.unregisterDatabaseChangeNotification(dcr);
   conn3.close();
   }



   /**
  * Creates a connection the database.
  */
   OracleConnection connect() throws SQLException

  {

  OracleDriver dr = new OracleDriver();
   Properties prop = new Properties();
   prop.setProperty("user","****");
   prop.setProperty("password","****");
  return (OracleConnection)dr.connect("*****",prop);
   }

}

/**
* DCN listener: it prints out the event details in stdout.
*/
class DCNDemoListener implements DatabaseChangeListener

{

  DBChangeNotification demo;
   DCNDemoListener(DBChangeNotification dem)

  {

   demo = dem;
   }

   public void onDatabaseChangeNotification(DatabaseChangeEvent e)

  {

  Thread t = Thread.currentThread();
   Log.e("GGGG","PLSSSSSSSSS");
  synchronized( demo ){ demo.notify();}

  }

}

Я выполнил этот пример кода из документации в Android Studio, вызвав функцию runButtonClick.Все это работает без ошибок или исключений.я просто не получаю уведомления при установке отдела.

я использую

android studio 3.1.2

android SDK 26.1.1

android платформа Android8.1 (Oreo) редакция 1

Драйвер jdbc является ojdbc6.

, а база данных является базой данных Oracle 11g express edition.

Используемый здесь код jdbc: https://docs.oracle.com/database/121/JJDBC/dbchgnf.htm#JJDBC28818

Может кто-нибудь помочь, пожалуйста ..

...