Saltear al contenido principal
Layout Activity_consultas.sql

Proyecto conexión Android con MySQL: versión Android Studio – Android 5.0

Conexión a una Base de Datos externa desde Android
1. Conexión a base de datos externa desde Android: SGDB
2. Instalacion de gestor de base de datos MySQL con XAMPP
3. Ejemplo de conexión Android con base de datos MySQL
4. Videotutorial: proyecto App Android con conexión remota a MySQL
5. Proyecto conexión Android con MySQL: versión Android Studio – Android 5.0

En este tutorial vamos a desarrollar una versión actualizada para Android 5.0 (API 21) del proyecto de conexión de una Aplicación Android con una base de datos externa MySQL. Esto nos exigirá utilizar la clase AsyncTask. , que será la encargada de procesar en segundo plano la conexión a dicha base de datos. Otra diferencia con la versión anterior de este proyecto es que usaremos el entorno de desarrollo Android Studio en vez de Eclipse.

Recordamos que en el proyecto creábamos una conexión a la base de datos MySQL, para posteriormente realizar consultas Transact-SQL mostrando el resultado de dichas consultas.

Al final de este tutorial, puedes descargar todo el código del proyecto.

Elementos del proyecto

El proyecto se centrará en el proceso de conexión a la base de datos, y explicaremos cómo ejecutar consultas desde un nuevo hilo de la aplicación a través de un componente EditText. Vamos a enumerar los elementos que intervendrán en dicho proceso:

  • Clase MainActivity, que hereda de la clase base Activity, dónde se define la lógica de conexión a la base de datos MySQL y envío de los datos de la conexión a la siguiente Activity.
  • Clases ConexionAsincrona y ConsultasAsincrona, que heredan de la clase base AsyncTask, encargadas de procesar en segundo plano la conexión con la base de datos externa y realizar la consulta proporcionada por el usuario.
  • Clase ConsultasSQL, que hereda de la clase base Activity, encargada de controlar la lógica de inserción de una consulta Transact-SQL, mostrando el resultado de dicha consulta.
  • Librería ‘mysql-connector-java-5.1.31-bin.jar’ para implementar las funcionalidades asociadas a la lectura, escritura o eliminación de una base de datos MySQL.

Estructura del Proyecto

Vemos la estructura del proyecto creado en esta ocasión con Android Studio:

Estructura Proyecto concexión Android a MySQL

Código fuente del Proyecto

Vamos a detallar las diferentes clases, layouts y consultas SQL que utilizamos en este proyecto.

ConsultasMySQL\app\src\main\java\com\academiaandroid\consultasmysql\MainActivity.java

  1. Se define una clase llamada MainActivity, que hereda de la clase base Activity, encargada de recoger los datos de conexión al servidor MySQL:
  2. Se declaran los componentes necesarios para introducir los datos de conexión al servidor:
    Debido a que gran parte de la funcionalidad consiste en trabajar con la librería de mysql, es conveniente que tengamos en cuenta la documentación oficial donde se habla de las clases que vamos a usar de la misma: java.sql.ResultSet y java.sql.Statement
  3. Se enlazan dichos componentes con sus recursos a nivel de layout:
  4. Se define un método llamado conectarMySQL() , que devolverá un valor de true o false, a partir del evento de conexión realizado por el usuario, dónde se asignará el driver a una variable de tipo String, se declara un Array de Strings, dónde se almacenan los datos para establecer la conexión al servidor MySQL, y dónde finalmente se invoca al método execute()  del hilo secundario pasándole como parámetros los datos de conexión y cita a almacenar en la tabla:

ConsultasMySQL\app\src\main\java\com\academiaandroid\consultasmysql\ConexionAsincrona.java

  1. Clase ConexionAsincrona que hereda de la clase base AsyncTask, que permite comunicarse con el hilo principal, y que realizará tareas en segundo plano. Esta clase define tres tipos genéricos:
    * Params: tipo de parámetro que se recibirá como entrada para la tarea en el método doInBackground(Params)
    * Progress: parámetro para actualizar el hilo principal o UIThread
    * Result: es el resultado devuelto por el procesamiento en segundo plano:
  2. Se declaran una variable de tipo Connection:
  3. Se sobrescribe el método doInBackground , que será donde se defina el código que se ejecutará en segundo plano. Recibe como parámetro un array de strings declarados en la clase MainActivity.java, al llamar al método execute(Params) . Inicialmente se establece la conexión con el Servidor MySQL indicándole la cadena de conexión formada por la dirección ip, puerto del servidor, la base de datos a la que vamos a conectarnos, y el usuario y contraseña de acceso al servidor:
  4. A continuación, se comprueba que la conexión al servidor se ha establecido para cambiar el valor de la variable estadoConexion a true:
  5. Finalmente se cierran las conexiones abiertas con el servidor y se devuelve el estado de la conexión:

ConsultasMySQL\app\src\main\java\com\academiaandroid\consultasmysql\ConsultasSQL.java

  1. Se define una clase llamada ConsultasSQL, que hereda de la clase base Activity, encargada de permitir al usuario realizar consultas Transact-SQL sobre la base de datos “Tienda”:
  2. A continuación, se declaran los componentes y clases necesarias para realizar consultas a una base de datos en MySQL:
  3. Posteriormente, dentro del método onCreate() , se enlazan los componentes con los recursos definidos en el layout:
  4. Finalmente, dentro del evento onClick() mostrarResultados , se conecta con el servidor MySQL y procesa la consulta realizada por el usuario, mostrando los resultados:
    En las siguientes líneas se asignan los valores devueltos por el hilo secundario, asignando a partir de su índice los datos referentes a la consulta (registros devueltos, número de filas y número de columnas):

ConsultasMySQL\app\src\main\java\com\academiaandroid\consultasmysql\ConsultasAsincrona.java

  1. Al igual que la clase descrita anteriormente, esta clase hereda de la clase base AsyncTask, y por lo tanto permite comunicarse con el hilo principal, y realizar tareas en segundo plano:
  2. Se declaran tres variable de tipo Connection, Statement y ResulSet:
  3. Se sobrescribe el método doInBackground , que será donde se defina el código que se ejecutará en segundo plano. Recibe como parámetro un array de strings declarados en la clase ConsultasSQL.java, con los datos de conexión y consulta a la base de datos, al llamar al método execute(Params) . Este método devuelve una array de strings con los registros de la consulta, además del número de filas y columnas. Inicialmente se declaran e inicializan los datos de conexión al servidor:
  4. A continuación, se ejecutará la consulta indicada en el campo edConsulta por el usuario:
  5. En el siguiente paso, se comprueba el número de filas devueltas por la consulta, para en caso de que sea superior a 0, se implemente un bucle que recorrerá y almacenará los resultados a partir de la consulta ejecutada:
  6. Finalmente se cierran las conexiones abiertas con el servidor:

ConsultasMySQL\app\src\main\res\layout\activity_main.xml
Layout activity_main.xml

  1. Se define un layout denominado ‘activity_main.xml‘ (layout de la clase MainActivity.java), que permitirá la inserción de datos en cuatro componentes de tipo EditText (dirección de servidor, nº de puerto, usuario y contraseña de la conexión al servidor), además de un componente de tipo Button para realizar la conexión y enviar los datos a la siguiente Activity:

ConsultasMySQL\app\src\main\res\layout\activityconsultassql.xml
Layout activity_consultas.sql

  1. Se define un layout denominado ‘activityconsultassql.xml‘ (layout de la clase ConsultasSQL.java), que permitirá insertar consultas Transact-SQL dentro de un campo EditText, para posteriormente poder ejecutar dicha consulta pulsando el componente Button definido, mostrando a continuación el resultado de dicha consulta en un componente EditText. Además dentro de este layout se definen cuatro componentes de tipo TextView y un componente EditText para mostrar los datos de la conexión al servidor enviados desde la Activity anterior:

Consultas SQL

Consulta SQL para crear Base de datos tienda:

Consulta SQL para crear la tabla cliente:

Consulta SQL para crear la tabla factura:

Estructura de la Base de Datos

Como se puede apreciar en la siguiente imagen, la base de datos tienda, estará formada por dos tablas llamadas cliente y factura, en las que se establece la relación entre el campo dni y el campo dni_cliente.

Además es necesario tener muy presente declarar dentro del AndroidManifest.xml los permisos necesarios para la conexión con el servidor remoto, en este caso permisos de Internet:

Descarga del proyecto

Aquí puedes descargar todo el código de este proyecto

Download

Esta entrada tiene 13 comentarios

  1. Estimados, al descomprimir el archivo .rar me da unos errores.. podrian controlar y comentarme
    Desde ya gracias

    Marcelo

    1. Ya encontre el problema.. el archivo rar esta OK. Mil disculpas.
      Gracias

  2. OK Marcelo, gracias por avisar porque tampoco a nosotros nos daba error al abrirlo.

  3. Tengo el código exactamente igual, sin errores. Sin embargo, al ejecutarla en mi móvil la primera pantalla sale correctamente pero al meter todo me aparece lo siguiente:
    Error al introducir los credenciales javanull pointer exception.

    La dirección del servidor es correcta, la he visto en ipconfig, el puerto igual 3306 lo tengo en xaamp, y el usuario y la contraseña de la base de datos también está bien.

    ¿Qué crees que puede ser?

  4. Hola Alejandro,
    como ya nos enviaste una consulta como usuario Premium a nuestro correo, te comentamos mejor por ese medio.
    Saludos

  5. Hola,

    Tengo una duda y me gustaría si podríais ayudarme.
    Usando este tutorial, quiero obtener siempre el último valor de mi base de datos, el cuál lo hago con esta consulta:

    String consulta = “SELECT * FROM valores WHERE ID =(SELECT max(ID) FROM valores)”;

    Sin embargo, en vez de mostrarlo cada vez que pulse el botón, quiero hacer un bucle infinito para que esté continuamente mostrándome el último valor.

    ¿Cómo sería esto posible con AsyncTask? Ya que intento hacer un bucle infinito pero debo de tener un problema de hilos ya que una vez que lo ejecuto, queda mi pantalla en negro.

    Muchas gracias.

    Saludos

    1. Hola Pedro,
      sentimos decirte que no tenemos soporte técnico en esta web para este tipo de consultas. La ayuda la podemos ofrecer en nuestros cursos online donde dispones de un Tutor experto que resuelve tus dudas y revisa los ejercicios que vas realizando.
      En cualquier caso, como excepción por ser usuario Premium, enviaremos tu consulta al tutor del curso Desarrollo de Aplicaciones para Android y si puede atenderla te contestaremos por email.
      Saludos

    2. Hola Pedro de nuevo,
      te vamos a pegar aquí la respuesta que nos ha dado el Tutor de nuestro curso de Programación Android, Víctor Ramírez:

      “Esto es una respuesta orientativa. Las tareas en background es algo que tratamos en el tema 4 del curso:

      Un bucle infinito, como ya has comprobado por la pantalla en negro, bloquea el hilo principal de la aplicación y por tanto impide que la sigas utilizando, tal y como comentas necesitarías implementar la clase AsyncTask.

      Puesto que tienes que compaginar la consulta de datos con la actualización de la interfaz se me ocurren dos opciones:
      – O bien metes el bucle infinito en el método doInBackground() y utilizas el metodo OnProgressUpdate() para ir actaulizando el valor en la interfaz, de este modo tu AsyncTask no terminaria nunca.
      – O realizas una única consulta en el doInBackground() y al finalizar ésta, en el onPostExecute() muestras el resultado por pantalla y reinicias de nuevo el AsyncTask

      Personalmente veo mejor la segunda opción, aunque en cualquiera de los dos casos estas continuamente repitiendo la misma consulta a la base de datos lo cual no parece muy eficiente. Tal vez deberías plantearte que en el momento en que ese valor pueda cambiar (no se cuando ocurrirá esto en tu aplicación) lances la consulta para comprobar el valor máximo, aunque ya tendríamos que conocer la aplicación en más detalle para ver si esto es posible.”

      Esperamos que te haya servido de ayuda.
      un saludo

  6. Finalmente pude conseguirlo con la segunda opción que recomendó Víctor Ramírez. Muchas gracias por la ayuda.

Los comentarios están cerrados.

Volver arriba
Esta web usa cookies para su correcto funcionamiento. No hay cookies de publicidad, aunque algunos de los contenidos mostrados (videos o documentos insertados) están alojados en servicios externos (Youtube, Vimeo, Box...) que sí pueden implementar sus propias cookies.    Más información
Privacidad