Android JDBC no funciona: ClassNotFoundException en el controlador

Intento utilizar JDBC en mi aplicación Android para conectarme a una base de datos remota para hacer inserciones, consultas, etc. He conectado y hecho estas cosas con éxito en un proyecto JAVA diferente. Así que pensé que, dado que Android es Java, podría exportar el código relevante, agregar la misma ruta de comstackción para el controlador, etc. Pero me da el error:

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 

Realmente no creo que sea un problema de código ya que el mismo código funciona en un proyecto Java (que acabo de ejecutar en main ()). Pero para referencia aquí está:

 String url = "jdbc:mysql://localhost:3306/eventhub_test"; // String user = "root"; String pass = ""; SQLUtils sqlu = new SQLUtils(url, user, pass); 

// la clase SQLUtils que hice:

 public class SQLUtils { private String CONNECTION_URL; private String user; private String pass; private java.sql.Statement stmt; private java.sql.Connection conn; public SQLUtils(String conn_url, String user, String pass) { this.CONNECTION_URL = conn_url; this.user = user; this.pass = pass; } public void init() throws IllegalAccessException, InstantiationException, ClassNotFoundException, SQLException { Class.forName ("com.mysql.jdbc.Driver").newInstance (); conn = DriverManager.getConnection(CONNECTION_URL, user, pass); stmt = conn.createStatement(); } } 

Así que estoy realmente confundido aquí. ¿JDBC no funciona con Android? Si es así, dígame qué alternativas debería considerar para acceder remotamente a la base de datos MySQL.

Gracias.

¿JDBC no funciona con Android?

JDBC no se usa con frecuencia en Android, y ciertamente no lo recomendaría.

En mi humilde opinión, JDBC está diseñado para conexiones de red de gran ancho de banda, baja latencia y alta confiabilidad (p. Ej., Computadora de escritorio a servidor de bases de datos, servidor de aplicaciones web a servidor de bases de datos). Los dispositivos móviles ofrecen poco de estos, y ninguno de ellos consistentemente.

Si es así, dígame qué alternativas debería considerar para acceder remotamente a la base de datos MySQL.

Cree un servicio web alrededor de su base de datos y acceda a ella desde Android.

Como beneficios secundarios, mejora la seguridad (frente a dejar su base de datos abierta), puede descargar algo de la lógica comercial del cliente, puede soportar mejor otras plataformas (por ejemplo, marcos móviles web o basados ​​en la web), etc.

Tuve un montón de problemas con esto por alguna razón. En otro lugar se menciona que solo funcionan 3.017 controladores, y dado que hice tales instrucciones detalladas pensé que los compartiría. (Mi propósito inicial era dar pasos para reproducir el error que podría utilizar para hacer una pregunta aquí y en otros lugares. No, no puedo comenzar a adivinar por qué tuve tantos problemas ahora mirando hacia atrás)


Para: obtener el controlador JDBC en la aplicación de Android

  • Nuevo Android Project – AndroidJDBCTest, Target Android4.03, SDK mínimo 8 (Android 2.2), nombre del paquete “com.test.AndroidJDBCTest”
  • Haga clic derecho en el proyecto, nueva carpeta “libs”
  • Descargue Mysql JDBC Driver desde aquí y extráigalo a su sistema de archivos.
  • Navegue hasta el directorio raíz después de extraer y arrastre y suelte el jar mysql-connector-java-3.0.17-ga-bin.jar en / libs en su proyecto en el explorador de proyectos dentro de Eclipse., Usando la configuración de “copia” predeterminada para el arrastrar y soltar.
  • Haga clic con el botón derecho en el proyecto Eclipse, compile la ruta de acceso de comstackción, agregue JAR en la pestaña de bibliotecas, vaya a / AndroidJDBCTest / libs y el archivo jar y haga clic en Aceptar
  • NOTA: Aparece ahora en el nodo “Bibliotecas referenciadas” (si Eclipse está configurado para mostrarlo)
  • Agregue código desde aquí hasta el final de onCreate() : básicamente Class.forName("com.mysql.jdbc.Driver").newInstance();
  • Conecte el dispositivo Honeycomb como Motorola Xoom family Edition y ejecútelo

Dejando de lado las objeciones válidas, puede hacer que funcione.

Primero, asegúrese de tener un contenedor de controladores válido en su ruta de comstackción, utilicé

 mysql-connector-java-5.1.7-bin.jar 

En segundo lugar, si lo intentas en el emulador y tu db está en tu máquina de desarrollo, ‘localhost’ no es bueno en la URL. Necesitas ’10 .0.2.2 ‘

Mi URL es:

 String url = "jdbc:mysql://10.0.2.2/test"; 

prueba siendo mi nombre db.

Tengo una tabla llamada ‘libros’ con un ‘título’ de columna en ella

El siguiente código funciona para mí:

 public void init() throws IllegalAccessException, InstantiationException, ClassNotFoundException, SQLException { Class.forName("com.mysql.jdbc.Driver").newInstance(); try { conn = DriverManager.getConnection(CONNECTION_URL, user, pass); } catch (java.sql.SQLException e1) { e1.printStackTrace(); } try { stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT title FROM books"); String entry; while (rs.next()){ entry = rs.getString(1); } rs.close(); stmt.close(); conn.close(); } catch (java.sql.SQLException e) { e.printStackTrace(); } } 

Al pasar en el depurador, veo los títulos en la entrada de cadena

En teoría, deberías ser capaz de hacer eso. Debe incluir el controlador JDBC de MySQL en su proyecto para que el código funcione ( aquí hay una publicación similar con soluciones).

Pero probablemente no sea una buena idea . Es mejor si expone los contenidos de la base de datos a través de una API dedicada (REST) ​​en su servidor.

Realmente no dan razones en el enlace, pero una de las principales razones por las que es una mala idea exponer directamente su base de datos es por cuestiones de seguridad. La mayoría de tus usuarios se portarán bien y harán solo lo que se supone que deben hacer con su teléfono, pero imagina que no.

Si tiene un inicio de sesión válido para su base de datos, entonces él / ella podría simplemente conectarse a su base de datos, hacer todo tipo de SELECT o incluso podría cambiar / destruir datos si los permisos lo permiten.

Es por eso que debe tener un servidor web intermedio que valide y desinfecte todas las solicitudes provenientes del usuario para asegurarse de que solo los datos que pretende distribuir se puedan recuperar de su base de datos MySQL.

Asegúrese de haber colocado el conector dentro de la carpeta de la biblioteca del proyecto. colocarlo allí, resolverá el problema

Si está desarrollando con Android Studio, agregar esta línea a su dependencia de Gradle hace la magia.

  compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.44' 

Y puede cambiar la versión de acuerdo a su necesidad.

Después de agregar esto, la sincronización de gradle se encargará de todo, solo tienes que conectarte a DB de la misma forma que lo haces en un progtwig java jdbc simple.

intente cambiar en el archivo gradle

  targetSdkVersion 8