Skip to content
Petición Cliente-Servidor

Conexión cliente Android a bbdd MySQL a través de un Servicio Web RESTful

En este tutorial vamos a desarrollar un Proyecto que nos permitirá, desde una Aplicación Android, conectar a una base de datos MySQLa través del servicio web RESTful, cuya creación ya explicamos en el tutorial anterior.

El Proyecto lo denominaremos ‘ClienteBiblioteca’ y como su nombre indica, nos permitirá gestionar los libros de una biblioteca desde la App. Como siempre, podrás descargar al final del tutorial el código completo de este proyecto.

Esquema del Proyecto

Antes de analizar en detalle el código del Proyecto Android, vamos a dar una visión general del mismo, describiendo brevemente los elementos utilizados y mostrando un diagrama de la conexión y peticiones HTPP, las pantallas que integran la Aplicación y la estructura del Proyecto

Elementos

Vamos a enumerar los elementos que hemos necesitado para el desarrollo del proyecto «ClienteBiblioteca»:

  • Clase SplashScreen, que herede de la clase base Activity, encargada de lanzar una pantalla de presentación al iniciar la aplicación, proporcionando una mayor inmersión del usuario en la aplicación.
  • Clase MainLogin, que herede de la clase base Activity, y que permitirá introducir los datos de conexión al servidor MySQL, comprobando que son correctos.
  • Clase GestionServicio, que herede de la clase base ListActivity, encargada de mostrar el listado de libros almacenados en la biblioteca, además de permitir la gestión de la misma.
  • Clase Adaptador, que herede de la clase base BaseAdapter, encargado de construir la vista de cada uno de los ítem que se mostrará en el componente ListView.
  • Clase Libro, que definirá el constructor con los argumentos para la creación de un nuevo objeto Libro, además de los métodos de acceso getter y setter para las propiedades privadas.
  • Layout activity_splash_screen.xml, formado por una componente de tipo ImageView, que mostrará el logotipo de la aplicación.
  • Layout activity_main_login.xml, formado por cuatro controles de tipo EditText que permitirán al usuario introducir los datos de conexión, un control de tipo CheckBox, que mostrará si los datos introducidos son correctos, y dos controles de tipo Button, encargados de comprobar y enviar los datos de conexión a la siguiente Activity.
  • Layout activity_gestion_servicio.xml, formado por cuatro controles de tipo EditText, encargados de almacenar valores asociados a un nuevo libro o existente, tres controles de tipo Button para realizar las tareas de creación, inserción o borrado de un libro, y un control ListView, para mostrar el listado de libros almacenados.
  • Layout item.xml, que definirá la vista personalizada de cada ítem que construya el control ListView.

Diagrama general: petición-respuesta HTTP y estado de conexión del servicio web

Pincha en la imagen si quieres ampliarla:

Diagrama petición Cliente-Servidor Web REST

Pantallas de la Aplicación

Esta aplicación se compone de las siguientes pantallas (además de la pantalla inicial de presentación). En el video de la próxima publicación podremos verlas al mostrar el funcionamiento de la Aplicación:
Pantalla conexión App Android Pantalla App Android comrpobación conexión

Pantalla App Android Gestion Biblioteca

Estructura del Proyecto

En esta imagen mostramos la estructura del proyecto, con las diferentes clases y ficheros de layout creados:

Estructura Proyecto Android ClienteBiblioteca

Documentación código fuente

Vamos a describir las distintas clases y layouts del proyecto «ClienteBiblioteca», así como las consultas Transact-SQL y el proyecto de Servicio Web que junto al ya desarrollado en el tutorial anterior (Servicio Web API RESTful) integran todo el ejemplo practico de conexión que queríamos mostrar. Al final, puedes descargar el código completo del Proyecto.

ClienteBiblioteca\app\src\main\java\com\academiaandroid\clientebiblioteca\MainLogin.java

Se define la clase MainLogin, que hereda de la clase base Activity, y que permite comprobar si los datos enviados al servicio web son correctos para la conexión al servidor de base de datos MySQL:

A continuación, y a nivel de clase, se declara una variable de tipo String que inicializa con la estructura principal de la URI para el acceso al servicio web:

Posteriormente, dentro del método onCreate(), se asocian las variables de tipo EditText, Button y CheckBox declaradas, con sus controles a nivel de layout:

Para finalizar dentro de esta clase, se define el método peticionServicio(String uri), que devolverá el estado de la conexión al servidor, y que recibe como parámetro de entrada la URI para realizar la petición al servicio web:

  • Se declara e inicializa una variable de tipo RequestQueue, encargada de crear una nueva petición en la cola del servicio web:

  • Se declara e inicializa un objeto de tipo JsonArrayRequest, que permite recuperar un JSONArray a partir de la URL que recibe. El constructor de la clase JsonArrayRequest recibe como argumentos de entrada el método para que el cliente realice operaciones sobre el servidor web, la URI para el acceso al recurso, la interfaz Response.Listener, encargada de devolver la respuesta parseada a la petición del cliente, y la interfaz Response.ErrorListener encargada de entregar una respuesta errónea desde el servicio web:

  • Se comprueba mediante un condicional if(), que el servicio web ha podido conectar con el servidor MySQL con los datos introducidos por el usuario:

  • Se definen las políticas para la petición realizada. Recibe como argumento una instancia de la clase DefaultRetryPolicy, que recibe como parámetros de entrada el tiempo inicial de espera para la respuesta, el número máximo de intentos, y el multiplicador de retardo de envío por defecto:

  • Se añade la petición a la cola con el objeto de tipo JsonArrayRequest:

ClienteBiblioteca\app\src\main\java\com\academiaandroid\clientebiblioteca\GestionServicio.java

Se define una nueva clase llamada GestionServicio, que hereda de la clase base ListActivity, y que gestionará un servidor de base de datos MySQL, a través de un servicio web, mostrando desde la lista de libros disponibles, hasta la creación,eliminación y actualización de dicha lista:

Dentro del método onCreate(), se asocian las variables de tipo TextView, EditText y ListView con sus recursos a nivel de layout. Además se recuperan los datos enviados desde la Activity anterior (datos referentes a la conexión con el servidor MySQL) y se invoca al método setAdapter() de la variable de tipo ListView, que recibirá como argumentos de entrada una instancia del constructor de la clase Adaptador, con sus parámetros de contexto y colección de objetos Libro:

Al igual que en la clase MainLogin (método peticionServicio(String uri)), se define un método denominado peticionServicioRead(String uri), que devolverá una colección de objetos Libro, y que recibe como parámetro de entrada la URI para realizar la petición al servicio web. A diferencia del método descrito en la clase MainLogin, y dentro de la interfaz Response.Listener (sobrecarga del método onResponse(JSONArray response)), se construye un bucle for() para recorrer la respuesta parseada y construir un nuevo objeto Libro por cada registro de la base de datos MySQL:

Se añade el objeto creado a la colección de tipo List<Libro>:

ClienteBiblioteca\app\src\main\res\layout\activity_main_login.xml

A nivel de layout, tendríamos activity_main_login.xml, que define el layout de la Activity MainLogin.java, y en el que se implementan cuatro controles de tipo EditText (se mencionarán sólo aquellos controles destinados a ser asignados en el controlador), encargados de permitir al usuario introducir los datos para construir la URI para la petición al servicio web, un control CheckBox, que mostrará el resultado de la petición al servicio, y dos controles de tipo Button, que enviarán la petición al servicio y a la siguiente Activity:

ClienteBiblioteca\app\src\main\res\layout\activity_gestion_servicio.xml

Otro de los layouts definidos sería activity_gestion_servicio.xml, que define el layout de la Activity GestionServicio.java, y que implementa cuatro controles de tipo EditText para la creación/modificación/eliminación de un libro de la biblioteca, tres controles de tipo Button, encargados de ejecutar las acciones comentadas con anterioridad, y un control ListView, que mostrará la lista de libros disponibles en la tabla Libros:

ClienteBiblioteca\app\src\main\res\layout\item.xml

Layout que define la vista personalizada de cada uno de los elementos que se mostrarán en el control ListView, y que estará formado por cuatro controles de tipo TextView:

 

Consultas Transact-SQL

Estas son las sentencias SQL necesarias para crear la estructura de base de datos MySQL que usaremos:

Crear base de datos «Biblioteca»

Crear tabla «libros»

Insertar un primer registro

Estructura tabla «libros»

Estructura Tabla libros
Como se puede apreciar en la imagen, la tabla ‘libros’, está formada por cuatro campos o columnas, dónde además de los campos isbn,autor y titulo (de tipo varchar y no permitiendo valores nulos), se define un campo llamado fecha de tipo Date, que almacenará la fecha de publicación del libro. Por último comentar que el campo isbn, será la clave primaria de esta tabla, y que representa el International Standard Book Number, o lo que es lo mismo, un identificador único para su uso comercial.

Permisos declarados en AndroidManifest.xml

Por último recordar que será necesario declarar dentro del AndroidManifest.xml los diferentes permisos necesarios para la conexión a Internet de la aplicación:

Dependencias gradle implementadas

Será necesario añadir las dependencias para las librerías Gson y Volley dentro del módulo app:

Servicio web REST

Dado que la idea principal de este ejercicio práctico será la de realizar peticiones desde un cliente Android a un servidor de base de datos MySQL, a través de un servicio web REST, se describirán algunos aspectos básicos del servicio utilizado para este ejemplo.

  • Entorno de desarrollo: Eclipse versión Luna Release (4.4.0).
  • Tipo de proyecto: «Dynamic Web Project».
  • Servidor Apache Tomcat 6.0.
  • Driver JDBC MySQL v5.1.31.
  • Xampp v3.2.1 (servidor de base de datos MySQL).
  • API Jersey 2.21 (Implementación de referencia de JAX-RS).
  • API JAX-RS (Java API for RestFul Web Services) del estándar Java EE.
  • Librería Gson.

Estructura del proyecto en Eclipse

Estructura Proyecto Eclipse

Documentación código fuente

ServicioBibliotecaREST\src\com\academiaandroid\serviciobibliotecarest\ControlBiblioteca.java

Una vez se ha creado un proyecto del tipo que se indica anteriormente (se recomienda revisar el tutorial donde creábamos el Servicio Web API RESTful), y añadidas las librerías Gson y el conector MySQL al mismo, se creará la clase ControlBiblioteca, que implementará un método que devuelva un listado de libros de la base de datos Biblioteca, por orden descendente del campo fecha, parseando el resultado de la consulta al formato json:

Se asigna el driver a una variable de tipo String:

Se carga el driver del conector JDBC:

Por último, se comprueba que el cursor esté situado en la primera fila:

ServicioBibliotecaREST\src\com\academiaandroid\serviciobibliotecarest\Libro.java

Además de la clase ControlBiblioteca, se deberá crear una segunda clase denominada Libro, donde se implementa un constructor que recibe como parámetros de entrada cuatro variables de tipo String, con los datos de isbn, autor, titulo y fecha para crear un nuevo objeto Libro por cada registro de la base de datos:

Si comprobamos el resultado de compilar el servicio web, y acceder a la URI http://localhost:8080/ServicioBibliotecaREST/rest/Biblioteca/lista/localhost/3306/Biblioteca/root/academiaandroid, mostraría el siguiente resultado (se deberán modificar los parámetros de usuario y password por los definidos en nuestra base de datos):


Referencias:


Descarga del Proyecto

Aquí puedes descargar el código de este proyecto

Download

En la próxima publicación explicaremos todo este ejercicio práctico que hemos desarrollado en un video, mostrando también el funcionamiento de la App

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. También se ha incluido en pruebas un Agente AI que incluye sus propias cookies   
Privacidad