Un poco de todo lo relacionado al area de la informatica... programacion, ocio, configuraciones, en fin herramientas que pueden ser utiles para un estudiante de ingenieria en ciencias y sistemas.

viernes, 1 de febrero de 2013

On 20:27 by Unknown in , ,    15 comments

No hay mucha informacion sobre como hacer este tipo de conexion de forma rapida y que funcione, si bien para java es muy sencillo y funciona a la primera para poder realizar la conexion con el emulador y la aplicacion de android lleva algunas variantes.


1. Lo primero es obtener el ojdbc14.jar ya sea el que se encuentra en la carpeta donde se encuentra instalado oracle en la ubicacion  $ORACLE_HOME/jdbc/lib/ojdbc14.jar donde 
oracle_home se encuentra generalmente en /usr/lib/oracle..........

Dependiendo de la version asi sera el ojdbc que se necesite, este la version 5, la 6 dependiendo de la base de datos que tengan instalada por lo que lo primero es probar con estas librerias, sino funciona se pueden descargar desde la pagina de oracle:
Por ejemplo yo use la version 10g xe de la base de datos y el ojdbc14 pero no me funciono ninguno de los de la pagina ni los que tenia en la carpeta de oracle, si llegan a tener el mismo problema pues la unica solucion que encontre es utilizar el ojdbc que trae la version oracle mobile server, luego de descargarla, la instale y busque el driver ojdbc14.jar y ese fue el que utilice y me funciono.

2. Una vez obtenido el bendito ojdbc.jar lo agregamos al proyecto como libreria (agregarlo a la carpeta lib del proyecto android y luego agregar el jar al proyecto).

Antes de empezar con la parte de programar debemos agregar esta linea al manifest del proyecto justo despues de el cierre del tag application


<uses-permission
        android:name="android.permission.INTERNET" />

Porque el no dar este permiso causa error al querer conectarse con una base de datos y es de los errores mas comunes que se dan pero que son dificiles de identificar.

3. Ahora lo que necesitamos es una clase para conectarnos a la base de datos, encontre una clase generica en Clase Generica la cual me sirvio de base para la conexion y que es la que se puede instancear desde cualquier activity de android, El codigo de la clase es:







4. Ya que tenemos la clase para conectarnos necesitamos un activity con el cual llamaremos a la clase generica y ya nos comunicaremos con la base de datos.




NOTA: Uno de los errores mas comunes es colocar en el parametro ip, la ip de la maquina o 'localhost'
en este caso se usa la ip 10.0.2.2 que funciona con el emulador.

Con este activity al dar clic en el boton nos mostrara que se ha conectado con exito a la base de datos. 

5. Ahora ya se pueden hacer consultas a las bases de datos, por ejemplo en la misma clase generica realizar los metodos para insertar datos como este 
 y luego solo se llama desde el activity desde algun componente o al cargar el mismo activity, dependiendo de como lo necesiten o quieran pasandole los parametros asignados desde algun edittext u otro componente:



Espero sea de ayuda este pequeno post sobre la conexion de android con oracle y sirva como base para realizar algun proyecto a partir de tener la conexion lista.

En el siguiente link pueden descargar el ejemplo realizado en android adt bundle version para linux.

APP

15 comentarios:

  1. Cuándo pasas la aplicación al smarth-phone si te corre bien,yo lo hice pero la aplicación se traba y se cierra.

    ResponderEliminar
    Respuestas
    1. Le cambiaste ip??? al correr la app desde el telefono tendrias que estar conectado a la misma red y donde haces la conexion
      Conexion conn = new Conexion("10.0.2.2"...... ya no seria la 10.0.2.2 sino la de la maquina o servidor donde estas corriendo oracle por ejemplo la 192.168.1.4 o algo asi.

      Eliminar
  2. Asi es la IP está cambiada, también le quite la linea de .penaltyDialog() , de lo contario me sale un error en el emulador Violated its self-enforced StrickMode policy. Por eso mi pregunta si te corre bien el app en el smart-phone, baje tu código pero me sale un error pero no se de que sea no marca errores en lineas de código.

    ResponderEliminar
    Respuestas
    1. El problema te da en el emulador entonces? pues no se que version estas usando pero no tendria que dar problema y la probaste en telefono?? yo probe en el celular y para que corra solo es de quitarle las lineas
      StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
      .permitNetwork().build();
      StrictMode.setThreadPolicy(policy);

      y en ip le puse la de mi maquina donde esta oracle 192.168.1.3 y conecte el telefono al router para que esten en la misma red y si funciona.

      Eliminar
    2. el problema lo tengo en el móvil, me marca error java.sql.SQLException: Io exception: The Network Adapter could not establish the connection,

      Eliminar
    3. pero el ioexception es porque estas haciendo una inserción y no se esta realizando correctamente, si te funciono en el emulador no te tiene que dar problema en el movil en todo caso revisa este link estan las causas mas comunes de este error

      http://stackoverflow.com/questions/7324125/oracle-io-exception-the-network-adapter-could-not-establish-the-connection

      Eliminar
  3. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  4. Hola fijate que me parece muy practico tu informacion, gracias! pero queria saber si podrias asesorarme de como conectarme a un webservice que tengo en xml y este a su ves tiene una base de datos oracle
    Saludos

    ResponderEliminar
  5. Es necesario un cliente de Base de datos en el equipo movil?
    Me funciona en el emulador pero no en el equipo movil.

    ResponderEliminar
  6. No encuentro las librerías, los link están caídos, me pueden ayudar un poco ?

    ResponderEliminar
    Respuestas
    1. Los enlaces de oracle ya no estan disponibles pero si descargas la aplicacion ahi dentro va la libreria ojdbc14 que sirve para conectarse a la BD.

      Eliminar
  7. Poca gente agradece en este tipo de publicaciones. Pero tu còdigo funcionó sin ningún problema. Gracias por dedicartiempo a compartir el conocimiento. Saludos. Fue de gran ayuda en la universidad.

    ResponderEliminar
  8. que android me recomiendan? mi idea es comprar uno nuevo en este buen fin

    ResponderEliminar
  9. en el siguiente codigo no espesificas que tipo de variable es stmt
    public void insert_goal(String codigo, String nombre, String desc) {


    int valorgoal = 0;

    try {
    stmt = conexion
    .prepareStatement("INSERT INTO goal VALUES (?,?,?,?)");

    stmt.setString(1, codigo);
    stmt.setString(2, nombre);
    stmt.setString(3, desc);
    stmt.setInt(4, valorgoal);

    int retorno = stmt.executeUpdate();

    System.out.println(retorno);
    } catch (SQLException sqle) {
    System.out.println("SQLState: " + sqle.getSQLState());
    System.out.println("SQLErrorCode: " + sqle.getErrorCode());
    sqle.printStackTrace();

    }

    }



    corregido seria asi
    ------------------------------------------------------------------
    public Statement stmt = null;


    public void insert_goal() {


    int valorgoal = 0;

    try {
    stmt = conexion.createStatement();

    String sql = "INSERT INTO ALUMNOS " +
    "VALUES (25, 'Maria', 'Ali')";
    stmt.executeUpdate(sql);



    System.out.println("insercion exitosa");
    } catch (SQLException sqle) {
    System.out.println("SQLState: " + sqle.getSQLState());
    System.out.println("SQLErrorCode: " + sqle.getErrorCode());
    sqle.printStackTrace();

    }

    }





    ResponderEliminar