¿Podemos conectar bases de datos MySQL remotas en Android usando JDBC?

Estoy desarrollando una aplicación cliente-servidor que requiere una conexión de base de datos remota.

Sé que los tutoriales en la web y más personas están utilizando PHP para interactuar con MySQL. Pero no soy tan bueno en PHP y mi experiencia previa es con Core Java, Swing y JDBC.

¿Alguien puede guiarme si es posible conectar una base de datos MySQL remota usando las API JAVA JDBC en la aplicación Android?

Básicamente: puede conectarse a su servidor MySQL (o lo que sea que use), pero no debe hacerlo directamente desde su aplicación Android.

Razones:

  1. Las aplicaciones de Android se pueden decomstackr y el cliente tendrá credenciales para acceder a su base de datos. Si utiliza las herramientas de hacking adecuadas, como Backtrack , este cliente malicioso puede acceder, conectarse y explotar los datos en su base de datos.

  2. Si su aplicación es para clientes de todo el mundo, entonces los clientes deben abrir y mantener una conexión con su base de datos por operación o conjunto de operaciones. Abrir una conexión de base de datos física lleva mucho tiempo, incluso cuando su cliente de PC está en una LAN al lado del servidor del motor de base de datos. Ahora, imagine abrir una conexión desde un país del otro lado del mundo, por ejemplo, China o Japón o desde un país de América del Sur como Brasil o Perú (donde vivo).

Por estas 2 razones que se me ocurren, es una mala idea intentar conectarse a MySQL o cualquier otro motor de base de datos directamente desde el dispositivo de su teléfono.

¿Cómo resolver este problema? Utilice una architecture orientada a servicios donde tendrá al menos dos aplicaciones:

  1. Aplicación del proveedor de servicios. Esta aplicación creará y publicará servicios web (preferiblemente RESTful) y puede establecer políticas para consumir los servicios web como autenticación y autorización de usuario. Esta aplicación también se conectará a la base de datos y ejecutará operaciones CRUD contra ella.

  2. Servicio de aplicación al consumidor. Esta sería su aplicación Android (o cualquier otro móvil).

A partir de su pregunta, se está enfocando en el punto 1. Como he dicho en mis comentarios, puede crear una aplicación web en Java, crear un servicio RESTful allí, que se reduce a un POJO (objeto antiguo simple de java) que tiene un método por servicio. En este método, como es completamente Java, puedes agregar otras funcionalidades como el uso de JDBC.

Aquí hay un ejemplo de kickoff usando Jersey, Jackson (biblioteca JSON) y JDBC:

@Path("/product") public class ProductRestService { @GET @Path("/list") @Produces(MediaType.APPLICATION_JSON) public List getProducts() { List productList = new ArrayList<>(); Connection con = ...; //retrieve your database connection Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT id, name FROM product"); while (rs.next()) { Product product = new Product(); product.setId(rs.getInt("id")); product.setName(rs.getString("name")); productList.add(product); } //ALWAYS close the resources rs.close(); stmt.close(); conn.close(); return productList; } } 

Puede consultar configuraciones adicionales de la aplicación web Java en un tutorial como el de mkyong o Vogella o cualquier otro similar (es demasiada información para colocar en esta respuesta).

Tenga en cuenta que esta aplicación puede evolucionar a una aplicación en capas, y el código JDBC irá en una clase DAO, y luego la clase ProductRestService accederá a la base de datos a través de esta clase DAO. Aquí hay otro ejemplo de inicio:

 public class ProductDao { public List getProducts() { List productList = new ArrayList<>(); Connection con = ...; //retrieve your database connection //the rest of the code explained above... return productList; } } @Path("/product") public class ProductRestService { @GET @Path("/list") @Produces(MediaType.APPLICATION_JSON) public List getProducts() { ProductDao productDao = new ProductDao(); return productDao.getProducts(); } } 

Y puede aplicar otros cambios a este proyecto, así como también está evolucionando.

¿Puedes decirme qué hace PHP aquí? (si desarrollo con PHP)

En lugar de escribir la aplicación de proveedor de servicios en Java (como se muestra arriba), puede hacerlo en PHP. O en Python, Ruby, C #, Scala o cualquier otro lenguaje de progtwigción que le proporcione esta tecnología. Una vez más, no estoy seguro de qué tipo de tutorial está leyendo, pero esto debe explicarse en alguna parte y explicar que a los efectos de ese tutorial creará los servicios utilizando PHP. Si se siente más cómodo escribiendo estos servicios en Java en lugar de en PHP o en cualquier otro idioma, no hay problema. A su aplicación de Android realmente no le importa qué tecnología se utiliza para producir los servicios web, solo se preocupará por consumir los servicios y que los datos que contienen se pueden consumir.

Es posible hacerlo pero no recomendado. Lo he hecho antes porque estaba en el mismo barco que tú, así que compartiré algunos códigos.

Usé este jdbc jar específicamente: https://www.dropbox.com/s/wr06rtjqv0q1vgs/mysql-connector-java-3.0.17-ga-bin.jar?dl=0

ahora para el código:

  package com.example.test.databaseapp; import java.sql.DriverManager; import java.sql.SQLException; import android.app.Activity; import android.content.Context; import android.os.AsyncTask; public class MainActivity extends Activity { static final String url = "jdbc:mysql://xxxx:xxxx/DBNAME"; static final String user = "client"; static final String pass = "password"; public static List objList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new Download(MainActivity.this, internalUrl).execute(); //async task for getting data from db } } 

Ahora para mi tarea asíncrona:

 public class Download extends AsyncTask { ProgressDialog mProgressDialog; Context context; private String url; public Download(Context context, String url) { this.context = context; this.url = url; } protected void onPreExecute() { mProgressDialog = ProgressDialog.show(context, "", "Please wait, getting database..."); } protected String doInBackground(Void... params) { try { Class.forName("com.mysql.jdbc.Driver"); java.sql.Connection con = DriverManager.getConnection(url, user, pass); java.sql.Statement st = con.createStatement(); java.sql.ResultSet rs = st.executeQuery("select * from table"); list = new ArrayList(); while (rs.next()) { String field= rs.getString("field"); MainActivity.playerList.add(new objectClass(field)); } } catch (SQLException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return "Complete"; } protected void onPostExecute(String result) { if (result.equals("Complete")) { mProgressDialog.dismiss(); } } } 

Asegúrese de incluir permisos de internet en el manifiesto. Siéntase libre de hacer más preguntas sobre mi código si tiene alguno.

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.