|
Eclipse: Acceso a MySQL desde Android con Eclipse, Java y JDBC
Explicamos en este tutorial cómo acceder desde un dispositivo con sistema Android a un servidor de base de datos MySQL Server. Para ello usaremos el IDE de desarrollo Eclipse, Java y JDBC para la conexión. Realizaremos una conexión directa sin necesidad de usar un servidor web con PHP, ni JSON ni nada por el estilo. Además, este método servirá para cualquier base de datos que admita JDBC. Explicamos cómo crear una aplicación Android desde cero, paso a paso.
Introducción, antecedentes, Android y bases de datosLa conexión directa a una base de datos MySQL, PostgreSQL, Oracle, SQL Server, Firebird, etc. desde un dispositivo con sistema Android (móvil, tablet) es perfectamente posible. En muchos sitios web hemos leído que Android sólo admite acceso a bases de datos SQLite y esto es un error. Lo que sí es cierto es que el propio sistema Android, como tal, sólo admite trabajar de forma independiente (sin un servidor de base de datos externo) con base de datos SQLite. Lo que quiere decir que en nuestro móvil o tablet con Android no podremos instalar un servidor de MySQL, Oracle, PostgreSQL, etc. Por lo tanto lo que explicaremos en este tutorial será cómo acceder y trabajar con una base de datos externa al dispositivo Android usando la conexión de red o de Internet. No necesitaremos hacer ningún tipo de instalación adicional en nuestro dispositivo Android, más allá de nuestra propia aplicación, no nesitaremos realizar tunneling, ni usar PHP, ni JSON ni nada por el estilo. El único requisito es que la aplicación desarrollada en Android requerirá de permiso para acceso a Internet, nada más. Y, por supuesto, necesitaremos de un servidor de bases de datos externo al que accederemos desde Android. Repetimos para aclarar las dudas al respecto: Android sólo admite de forma local trabajar con bases de datos SQLite, la base de datos residirá en el dispositivo móvil con Android. Pero Android, puesto que cuenta con compilador Java y todo lo que ello conlleva, admite perfectamente trabajar con cualquier motor de base de datos que permita acceso mediante JDBC. En este último caso la base de datos, obviamente, residirá en un servidor externo con Windows o Linux como sistema operativo y el dispositivo accederá a dicho servidor mediante la conexión de red o Internet. En el siguiente tutorial explicamos cómo trabajar con bases de datos SQLite desde Android: Por supuesto, cada desarrollador estimará qué método usar para conectar una aplicación Android con un motor de base de datos externo, puede estimar usar PHP y JSON, nosotros no decimos que no se haga así, sólo decimos que puede realizarse una conexión directa desde Android a MySQL usando JDBC y Java como explicaremos a continuación.
Requisitos para desarrollar aplicación para dispositivos Android con EclipseEntorno de desarrollo de aplicaciones para Android con EclipseEn el siguiente enlace mostramos un tutorial donde explicamos paso a paso cómo instalar Eclipse y cómo preparar el entorno para desarrollar aplicaciones para dispositivos con Android en Linux: Para Microsoft Windows 8:
Equipo o servidor con MySQL ServerComo ya hemos comentado necesitaremos disponer de un servidor de MySQL, en los siguientes tutoriales explicamos cómo instalarlo sobre Windows y Linux:
Añadir proyecto Android a Eclipse para aplicación acceso MySQL, crear activity principal y menúEn primer lugar, si aún no lo tenemos creado, crearemos un nuevo proyecto en Eclipse, para ello lo abriremos y pulsaremos en el menú "File" - "New" - "Project": Desplegaremos "Android" y seleccionaremos "Android Application Project": Introduciremos los datos para el nuevo proyecto Eclipse para dispositivos Android:
Tras introducir los datos para el nuevo proyecto Eclipse para dispositivos Android pulsaremos "Next": Si hemos seleccionado la opción de crear un icono para la aplicación, el asistente nos mostrará la ventana para crear el icono personalizado, podremos cambiar el icono, cambiar color de fondo y otras opciones: Marcaremos "Create Activity" para crear una activity (ventana) principal de la aplicación, seleccionaremos el tipo de activity que crearemos, en nuestro caso "BlankActivity": Introduciremos los datos para la nueva activity:
Para más información sobre los activity de Android podéis vistar este tutorial: Tras introducir los datos para el activity pulsaremos "Finish" para crear el proyecto: El asistente para añadir un nuevo proyecto Eclipse para dispositivos Android creará todos los ficheros necesarios para el proyecto, a continuación indicamos algunos de los más importantes:
El asistente nos dejará la pestaña del layout abierta, para edición en modo gráfico, añadiremos al layout del activity principal de la aplicación los siguientes componentes:
Todos estos datos visuales se guardarán en el fichero /res/layout/activity_ajpd_soft_my_sql.xml, en nuestro caso tendrá este contenido:
El contenido del fichero donde se guardarán todas las cadenas de texto que usaremos en la aplicación "res/values/strings.xml":
El contenido del fichero que mostrará el menú en el activity "/res/layout/menu/activity_ajpd_soft_my_sql.xml": Podremos compilar la aplicación para probarla y ver cómo quedan los componentes visuales, de momento ningún botón funcionará pues aún no lo hemos programado, pero nos servirá para comprobar que todo es correcto. Para ello pulsaremos en "Run" - "Run": Seleccionaremos "Android Application" y pulsaremos "OK": Si todo es correcto se iniciará el emulador de dispositivos Android y se ejecutará la aplicación: Incluso podremos pulsar en "MENU" para comprobar que el menú aparece correctamente en la parte inferior: El código XML del fichero "/bin/AndroidManifest.xml": Cabe destacar "uses-permission android:name="android.permission.INTERNET"" que será el permiso necesario para que la aplicación funcione, pues será necearia la conexión a Internet (o a una red wifi) para acceder al servidor de MySQL Server.
Añadir segundo activity para introducción de los datos de conexión con servidor MySQLNuestra aplicación de ejemplo contará con dos activity, por un lado el anteriormente creado que será el principal, donde el usuario introducirá la consulta SQL a ejecutar y donde se mostrará el resultado. Por otro lado, nuestra aplicación requerirá de un segundo activity donde solicitaremos al usuario los datos de acceso al servidor MySQL al que nos conectaremos (IP, puerto, base de datos, usuario, contraseña). Para añadir un segundo activity a nuestra aplicación para dispositivos Android desde Eclipse, pulsaremos con el botón derecho del ratón sobre el proyecto y seleccionaremos "New" - "Other": Desplegaremos "Android" y seleccionaremos "Android Activity": Seleccionaremos "BlankActivity" y pulsaremos "Next": Introduciremos los datos para el nuevo Activity:
Pulsaremos "Finish": El asistente nos dejará la pestaña del layout abierta, para edición en modo gráfico, añadiremos al layout del activity secundario (el que mostrará los datos de conexión al servidor MySQL) los siguientes componentes:
Todos estos datos visuales se guardarán en el fichero /res/layout/activity_activity_configuracion.xml, en nuestro caso tendrá este contenido:
Este activity también incorporará un menú, el fichero xml del menú "/res/layout/menu/activity_activity_config.xml": El segundo activity en ejecución: Nota: más adelante explicaremos y mostraremos todo el código Java para hacer funcionar todas las opciones visuales de la aplicación Android con acceso a MySQL.
Descargar y añadir JDBC a proyecto Eclipse para acceso a MySQL desde AndroidEn primer lugar necesitaremos el JDBC para el motor de base de datos al que queramos acceder desde Android, en nuestro caso, como ejemplo, accederemos a un servidor de MySQL Server instalado en un equipo Linux. Para descargar el JDBC accederemos a la web oficial del motor de base de datos y descargaremos el fichero correspondiente al JDBC, para MySQL accederemos a la URL:
A la fecha de este tutorial descargamos la versión Connector/J 5.1.24, podremos descargar el .tar o el .zip, ambos son válidos para cualquier sistema operativo. Una vez descargado el fichero mysql-connector-java-5.1.24.zip lo descomprimiremos pulsando con el botón derecho del ratón sobre él y seleccionado "Extraer aquí": Dentro de este fichero comprimido habrá varios (.jar, documentación, código fuente), el importante es el mysql-connector-java-5.1.24-bin.jar, copiaremos este fichero (pulsando sobre él con el botón derecho): Desde Eclipse, exploraremos nuestro proyecto Android, pulsaremos con el botón derecho sobre la carpeta "libs" y pulsaremos en "Paste" (para pegar el fichero .jar del conector de MySQL):
Ejemplo acceso a BD MySQL desde Android con JDBC y EclipseUna vez agregado el conector .jar a nuestro proyecto (como hemos indicado aquí) ya podremos usar todas las funciones y prodedimientos para conectar con el motor de base de datos MySQL desde nuestra aplicación Android con Eclipse. Para ello será tan sencillo como agregar en los imports de nuestro fichero .java lo siguiente:
Añadiremos la siguiente variable de tipo "Connection", que usaremos para conectarnos sólo una vez durante el proceso de ejecución de una consulta SQL en MySQL:
Añadiremos un procedimiento para conectarnos al servidor MySQL, así podremos usarlo cada vez que lo necesitemos. Dicho procedimiento necesitará usuario, contraseña, IP o DNS, puerto y catálogo del servidor de MySQL al que nos conectaremos, si hay algún error lo capturará y lo mostrará en una notificación Android: public void conectarBDMySQL (String usuario, String contrasena, String ip, String puerto, String catalogo) { if (conexionMySQL == null) { String urlConexionMySQL = ""; if (catalogo != "") urlConexionMySQL = "jdbc:mysql://" + ip + ":" + puerto + "/" + catalogo; else urlConexionMySQL = "jdbc:mysql://" + ip + ":" + puerto; if (usuario != "" & contrasena != "" & ip != "" & puerto != "") { try { Class.forName("com.mysql.jdbc.Driver"); conexionMySQL = DriverManager.getConnection(urlConexionMySQL, usuario, contrasena); } catch (ClassNotFoundException e) { Toast.makeText(getApplicationContext(), "Error: " + e.getMessage(), Toast.LENGTH_SHORT).show(); } catch (SQLException e) { Toast.makeText(getApplicationContext(), "Error: " + e.getMessage(), Toast.LENGTH_SHORT).show(); } } } } Como ejemplo nos conectaremos al servidor MySQL desde nuestra aplicación Android, ejecutaremos una consulta SQL que devuelve registros y mostraremos el resultado en un cuadro de texto: buttonEjecutar.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { try { SSring QSLEjecutar = "select * from facturas limit 10"; conectarBDMySQL("root", "contraseña", "ajpdsoft.com", "3306", "bdfacturas"); Statement st = conexionMySQL.createStatement(); ResultSet rs = st.executeQuery(SQLEjecutar); String resultadoSQL = ""; Integer numColumnas = 0; //número de columnas (campos) de la consula SQL numColumnas = rs.getMetaData().getColumnCount(); //mostramos el resultado while (rs.next()) { for (int i = 1; i <= numColumnas; i++) { if (rs.getObject(i) != null) { if (resultadoSQL != "") if (i < numColumnas) resultadoSQL = resultadoSQL + rs.getObject(i).toString() + ";"; else resultadoSQL = resultadoSQL + rs.getObject(i).toString(); else if (i < numColumnas) resultadoSQL = rs.getObject(i).toString() + ";"; else resultadoSQL = rs.getObject(i).toString(); } else { if (resultadoSQL != "") resultadoSQL = resultadoSQL + "null;"; else resultadoSQL = "null;"; } } resultadoSQL = resultadoSQL + "n"; } textResultadoSQL.setText(resultadoSQL); st.close(); rs.close(); } catch (Exception e) { Toast.makeText(getApplicationContext(), "Error: " + e.getMessage(), Toast.LENGTH_SHORT).show(); } } }); }
Código Java aplicación AjpdSoft Acceso MySQL AndroidCódigo Java completo del fichero "/src/AjpdSoftMySQL.java", este fichero contendrá el código Java del activity principal de la aplicación, desde donde el usuario podrá escribir las consultas SQL que desee y ejecutarlas. En el código incluimos todo lo necesario para conectar con el servidor MySQL especificado, guardar configuración, cargar configuración, obtener lista de catálogos de MySQL (bases de datos), consulta de selección, consulta de modificación, obtener datos de consultas de selección, mostrar menú, etc.: package com.example.ajpdsoftmysql; import android.net.Uri; import android.os.Bundle; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.CheckBox; import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class AjpdSoftMySQL extends Activity { String ipServidorMySQL, contrasenaMySQL, usuarioMySQL, puertoMySQL; static String SQLEjecutar; String catalogoMySQL; TextView textSQL, textResultadoSQL; private Button buttonEjecutar; private Button buttonCatalogos; private Spinner spnCatalogos; private CheckBox chbSQLModificacion; static Connection conexionMySQL; String[] listaCatalogos; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_ajpd_soft_my_sql); //Asignamos cada objeto visual creado en el layout xml a su //respectiva variable textSQL = (TextView)findViewById(R.id.txtSQL); spnCatalogos = (Spinner)findViewById(R.id.lsCatalogos); textResultadoSQL = (TextView)findViewById(R.id.txtResultadoSQL); buttonEjecutar = (Button) findViewById(R.id.btEjecutar); buttonCatalogos = (Button) findViewById(R.id.btCatalogos); chbSQLModificacion = (CheckBox) findViewById(R.id.opConsultaModificacion); //Botón para mostrar lista de catálogos (bases de datos) de MySQL buttonCatalogos.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { obtenerListaCatalogos(); try { ArrayAdapter Y el código del fichero "/src/Activity_Configuracion.java" correspondiente al activity donde introduciremos los datos de conexión al servidor MySQL y desde donde podremos realiar una conexión de prueba. En dicho código guardaremos los valores en un fichero de configuración y podremos probar la conexión al servidor MySQL, también mostramos el menú correspondiente a este activity: package com.example.ajpdsoftmysql; import android.net.Uri; import android.os.Bundle; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import android.content.SharedPreferences; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class Activity_Configuracion extends Activity { TextView textIP, textPuerto, textContrasena, textUsuario; private Button buttonProbarConexion; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_activity__configuracion); //Asignamos a cada objeto visual creado a su //respectivo elemento de main.xml textIP = (TextView)findViewById(R.id.txtIP); textPuerto = (TextView)findViewById(R.id.txtPuerto); textContrasena = (TextView)findViewById(R.id.txtContrasena); textUsuario = (TextView)findViewById(R.id.txtUsuario); buttonProbarConexion = (Button) findViewById(R.id.btProbarConexion); //Botón para ejecutar consulta SQL en MySQL buttonProbarConexion.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { //Conectamos con el servidor de MySQL directamente try { String conexionMySQLURL = "jdbc:mysql://" + textIP.getText().toString() + ":" + textPuerto.getText().toString(); String usuario = textUsuario.getText().toString(); String contrasena = textContrasena.getText().toString(); Toast.makeText(getApplicationContext(), "Conectando a servidor MySQL", Toast.LENGTH_SHORT).show(); Class.forName("com.mysql.jdbc.Driver"); Connection con = DriverManager.getConnection(conexionMySQLURL, usuario, contrasena); Toast.makeText(getApplicationContext(), "Conectado Servidor MySQL", Toast.LENGTH_LONG).show(); con.close(); } catch (ClassNotFoundException e) { Toast.makeText(getApplicationContext(), "Error: " + e.getMessage(), Toast.LENGTH_SHORT).show(); } catch (SQLException e) { Toast.makeText(getApplicationContext(), "Error: " + e.getMessage(), Toast.LENGTH_SHORT).show(); } catch (Exception e) { Toast.makeText(getApplicationContext(), "Error: " + e.getMessage(), Toast.LENGTH_LONG).show(); } } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_activity__configuracion, menu); return true; } //código para cada opción de menú @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_guardar_configuracion: guardarConfiguracion(); return true; case R.id.menu_acerca_de: visitarURL("http://www.ajpdsoft.com"); return true; default: return super.onOptionsItemSelected(item); } } //guardar configuración aplicación Android usando SharedPreferences public void guardarConfiguracion() { try { SharedPreferences prefs = getSharedPreferences("AjpdSoftMySQL", Context.MODE_PRIVATE); SharedPreferences.Editor editor = prefs.edit(); editor.putString("Conexión", textIP.getText().toString()); editor.putString("Contraseña", textContrasena.getText().toString()); int puerto = 3306; puerto = Integer.valueOf(textPuerto.getText().toString()); editor.putInt("Puerto", puerto); editor.putString("Usuario", textUsuario.getText().toString()); editor.commit(); } catch (Exception e) { Toast.makeText(getApplicationContext(), "Error: " + e.getMessage(), Toast.LENGTH_LONG).show(); } } //cargar configuración aplicación Android usando SharedPreferences public void cargarConfiguracion() { try { SharedPreferences prefs = getSharedPreferences("AjpdSoftMySQL", Context.MODE_PRIVATE); textIP.setText(prefs.getString("Conexión", "192.168.1.100")); textContrasena.setText(prefs.getString("Contraseña", "")); int puerto = 3306; puerto = prefs.getInt("Puerto", 3306); textPuerto.setText(Integer.toString(puerto)); textUsuario.setText(prefs.getString("Usuario", "root")); } catch (Exception e) { Toast.makeText(getApplicationContext(), "Error: " + e.getMessage(), Toast.LENGTH_LONG).show(); } } //Abrir navegador con URL determinada public void visitarURL(String url) { Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity(browserIntent); } //en el evento "Cerrar ventana" guardar los datos en fichero xml @Override public void onDestroy() { super.onDestroy(); guardarConfiguracion(); } //en el evento "Abrir ventana" leemos los datos de configuración del fichero xml @Override protected void onStart() { super.onStart(); cargarConfiguracion(); } } En el siguiente enlace se puede descargar de forma gratuita el proyecto completo en Eclipse:
Aplicación Android AjpdSoft Acceso MySQL en funcionamientoA continuación explicamos cómo funciona la aplicación AjpdSoft Acceso MySQL Android, tras abrirla en el dispositivo smartphone o tablet con Android, pulsaremos en el botón de Menú del dispositivo: Aparecerá el menú en la parte inferior, tocaremos en "Configuración": Introduciremos los datos de conexión al servidor MySQL al que queramos conectarnos (IP, Puerto, Usuario y Contraseña): Pulsaremos el botón de Menú del dispositivo y en el menú tocaremos en "Guardar configuración", de esta forma los datos de conexión se guardarán para futuras conexiones. Una vez establecidos los datos podremos pulsar en el botón "Probar conexión", si todo es correcto mostrará el mensaje "Conectado servidor MySQL", cerraremos esta ventana y volveremos a la ventana principal pulsando el botón Atrás del dispositivo: Ahora deberemos elegir el catálogo (base de datos) que usaremos, para obtener las bases de datos del servidor al que nos hemos conectado pulsaremos en "Catálogos": Nos mostrará en una lista desplegable todos los catálogos a los que el usuario especificado anteriormente tendrá acceso, tocaremos en el que queramos usar, por ejemplo "bdajpdsoft": Ahora ya podremos introducir la consulta SQL que queramos para mostrar los datos que necesitemos, en el ejemplo mostramos la suma total de un campo de una tabla con:
Tras escribir la consulta SQL tocaremos en "Ejecutar":
La aplicación mostrará todos los datos de la consulta SQL ejecutada (nombre de las columnas y valor de cada una de ellas): AjpdSoft Acceso MySQL Android también permite ejecutar consultas SQL de modificación de datos (INSERT, UPDATE, DELETE, DROP, CREATE, ALTER), para ello escribiremos la consulta SQL y marcaremos "SQL de modificación": En el siguiente enlace se puede descargar de forma gratuita el proyecto completo en Eclipse:
Publicar aplicación Android en Google PlayEn el siguiente tutorial explicamos cómo publicar una aplicación para dispotivos Android en Google Play (antes Google Android Market):
Artículos relacionados
CréditosArtículo realizado íntegramente por Alonsojpd miembro fundador del proyecto Proyecto AjpdSoft. Anuncios
Enviado el Sábado, 25 mayo a las 01:23:29 por ajpdsoft
|
|