Conectarse a MySQL desde Android con JDBC

Usé el siguiente código para conectar MySQL en localhost desde Android. Solo muestra las acciones dadas en la sección catch. No sé si es un problema de conexión o no.

 package com.test1; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class Test1Activity extends Activity { /** Called when the activity is first created. */ String str="new"; static ResultSet rs; static PreparedStatement st; static Connection con; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final TextView tv=(TextView)findViewById(R.id.user); try { Class.forName("com.mysql.jdbc.Driver"); con=DriverManager.getConnection("jdbc:mysql://10.0.2.2:8080/example","root",""); st=con.prepareStatement("select * from country where id=1"); rs=st.executeQuery(); while(rs.next()) { str=rs.getString(2); } tv.setText(str); setContentView(tv); } catch(Exception e) { tv.setText(str); } } } 

Cuando este código se ejecuta, muestra “nuevo” en el avd.

 java.lang.management.ManagementFactory.getThreadMXBean, referenced from method com.mysql.jdbc.MysqlIO.appendDeadlockStatusInformation Could not find class 'javax.naming.StringRefAddr', referenced from method com.mysql.jdbc.ConnectionPropertiesImpl$ConnectionProperty.storeTo Could not find method javax.naming.Reference.get, referenced from method com.mysql.jdbc.ConnectionPropertiesImpl$ConnectionProperty.initializeFrom 

¿Alguien puede sugerir alguna solución? Y gracias de antemano

No se puede acceder a una base de datos MySQL desde Android de forma nativa. EDIT: en realidad, es posible que pueda usar JDBC, pero no se recomienda (¿o puede que no funcione?) … ver Android JDBC no funciona: ClassNotFoundException en el controlador

Ver

http://www.helloandroid.com/tutorials/connecting-mysql-database

http://www.basic4ppc.com/forum/basic4android-getting-started-tutorials/8339-connect-android-mysql-database-tutorial.html

Android no puede conectarse directamente al servidor de la base de datos. Por lo tanto, necesitamos crear un servicio web simple que pase las solicitudes a la base de datos y devuelva la respuesta.

http://codeoncloud.blogspot.com/2012/03/android-mysql-client.html

Para la mayoría de los usuarios [buenos], esto podría estar bien. Pero imagina que obtienes un hacker que consigue tu progtwig. He descomstackdo mis propias aplicaciones y da miedo lo que he visto. ¿Qué sucede si obtienen su nombre de usuario / contraseña en su base de datos y causan esgulps? Malo.

este código se ejecuta permanentemente !!! creado por diko (Turquía)

 public void mysql() { try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } thrd1 = new Thread(new Runnable() { public void run() { while (!Thread.interrupted()) { try { Thread.sleep(100); } catch (InterruptedException e1) { } if (con == null) { try { con = DriverManager.getConnection("jdbc:mysql://192.168.1.45:3306/deneme", "ali", "12345"); } catch (SQLException e) { e.printStackTrace(); con = null; } if ((thrd2 != null) && (!thrd2.isAlive())) thrd2.start(); } } } }); if ((thrd1 != null) && (!thrd1.isAlive())) thrd1.start(); thrd2 = new Thread(new Runnable() { public void run() { while (!Thread.interrupted()) { if (con != null) { try { // con = DriverManager.getConnection("jdbc:mysql://192.168.1.45:3306/deneme", "ali", "12345"); Statement st = con.createStatement(); String ali = "'fff'"; st.execute("INSERT INTO deneme (name) VALUES(" + ali + ")"); // ResultSet rs = st.executeQuery("select * from deneme"); // ResultSetMetaData rsmd = rs.getMetaData(); // String result = new String(); // while (rs.next()) { // result += rsmd.getColumnName(1) + ": " + rs.getInt(1) + "\n"; // result += rsmd.getColumnName(2) + ": " + rs.getString(2) + "\n"; // } } catch (SQLException e) { e.printStackTrace(); con = null; } try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } else { try { Thread.sleep(300); } catch (InterruptedException e) { e.printStackTrace(); } } } } }); } 

Si necesita conectar su aplicación a un servidor, puede hacerlo a través de PHP / MySQL y JSON http://www.androidhive.info/2012/05/how-to-connect-android-with-php-mysql/ .Mysql El código de conexión debe estar en la clase AsynTask. No lo ejecute en Main Thread.

¿Desea mantener su base de datos en el móvil? Use sqlite en lugar de mysql.

Si la idea es mantener la base de datos en el servidor y el acceso desde el móvil. Use un servicio web para buscar / modificar datos.

Otro enfoque es utilizar un Controlador JDBC Virtual que utiliza una architecture de tres niveles: su código JDBC se envía a través de HTTP a un Servlet remoto que filtra el código JDBC (configuración y seguridad) antes de pasarlo al Controlador JDBC de MySql. El resultado se envía de vuelta a través de HTTP. Hay algunos progtwigs gratuitos que usan esta técnica. Solo busque “Controlador JDBC de Android a través de HTTP”.

 public void testDB() { TextView tv = (TextView) this.findViewById(R.id.tv_data); try { Class.forName("com.mysql.jdbc.Driver"); // perfect // localhost /* * Connection con = DriverManager .getConnection( * "jdbc:mysql://192.168.1.5:3306/databasename?user=root&password=123" * ); */ // online testing Connection con = DriverManager .getConnection("jdbc:mysql://173.5.128.104:3306/vokyak_heyou?user=viowryk_hiweser&password=123"); String result = "Database connection success\n"; Statement st = con.createStatement(); ResultSet rs = st.executeQuery("select * from tablename "); ResultSetMetaData rsmd = rs.getMetaData(); while (rs.next()) { result += rsmd.getColumnName(1) + ": " + rs.getString(1) + "\n"; } tv.setText(result); } catch (Exception e) { e.printStackTrace(); tv.setText(e.toString()); } } 

intente cambiar en el archivo gradle el targetSdkVersion a 8

 targetSdkVersion 8