Conectar Aplicación Android con BD MySQL

Srednuht

Buenas, a ver si me podeis echar un cable.

Yo tengo una página web con su propia base de datos hosteada en un servidor. Lo que necesito ahora es conectar la APP de dicha web a la misma base de datos, para que, por ejemplo, si la APP tiene login, vaya a la base de datos de la WEB a comprobar si existe o no. O que los cambios que haga el usuario a través de la APP se vean registrados en la Web o viceversa.

Muchas gracias!

PD: He googleado y parece que JSON es el camino, pero no me aclaro, decir que soy un newbie en estos temas asi que un poco de paciencia. Gracias otra vez!

Soltrac

El mejor camino es usar webservices.

1 1 respuesta
Srednuht

#2 Hmmm puedes explicarte un poco mejor? Gracias

Te refieres a que por ejemplo el login de la APP llame a un WebService y este Web Service pida los datos al servidor?

1 2 respuestas
Soltrac

#3 Ahí estamos : )

tOWERR

Yo he estado trabajando con ello, y he trabajando haciendo archivos PHP en el cual me descargo los datos haciendo peticiones a esas páginas.

2 respuestas
Tig

#3 Ejemplo sencillo y con pseudolenguaje

Móvil (quiero loguearme)

-->petición POST api.midominio.com/login, parámetros: nombre usuario, contraseña cifrada

Servidor (leo esos datos, compruebo si el login es válido y devuelvo código HTTP 200 ó 403)

--> response, status: 200

Móvil (veo código 200, el usuario procede a la siguiente pantalla)

Y así con todas las operaciones que quieras. Ni se te ocurra conectarte en remoto a la DB!

#5 espero que no te estés descargando cada vez las tablas al móvil para hacer ahí la consulta!

2 respuestas
Srednuht

gracias a todos por responder

#6 Entonces he de hacer un servlet? no puedo hacer como si de JSP se tratase?

En jsp para crear una web dinamica cuyos "datos dinámicos" dependan de los datos de una Bd tengo que crear una conexion y luego ya ejecuto los query, no hay nada parecido para esto?

En jsp, por ejemplo, cuando le mando por POST el user y la pass, tengo un login.jsp que lo que hace es comprobar que eso existe, y si existe crea la sesion y te redirige a index.

tendría pues que hacer que el formulario de mi movil fuese a app.midominio.com/login.php y hacer lo mismo? o como está el tema.

insisto en que estoy algo verde aún xD ( por si suelto una barbaridad)

#5 segun entiendo, lo que tu haces es que cada vez que accedes a la app, descargas los datos de la BD y los vuelcas en una BD de tipo SQLite no? eso me parece una locura extrema

POR CIERTO:

Se agradecería cualquier fuente con un tutoríal for dummies or something like that.

3 respuestas
Tig

#7 no sé de servlets ni de JSPs, pero probablemente puedes reutilizar tu misma función de login y, en vez de redirigir a index, devolver un código 200 dependiendo del origen/tipo de la petición

1er resultado en google de "Restful for dummies" http://www.bloggersworld.com/index.php/2011/02/08/rest-for-dummies/

Busca "servicios rest", "restful services", junto con java/servlets/etc. Hay cientos de tutoriales

1 1 respuesta
BLZKZ

#7 no, puede que haya hecho una api en php, lo que se descargará de cada vez será un xml o un json con la info que necesita, no se descarga todo y lo mete en una bbdd

1
Srednuht

#8 Vale, yo buscaba directamente :"conectar app con BD Mysql" y habian cosas pero no me iban bien... ahora buscare pro servicios rest y demás, muchas gracias, a ver si lo consigo y lo posteo por si hiciera falta para el futuro. Gracias otra vez

tOWERR

#6 No, no me descargo los datos siempre, hay una opción de sincronización la cual cuando se descargan los datos se van almacenando en una BD en el terminal.

#7 No hago eso siempre, lo hago una vez solamente. La aplicación está hecha para empresas, no para particulares, las empresas no les importa la cantidad de datos que se descargan. De todas maneras no descargan tantos datos como pensáis.

1 respuesta
Srednuht

#11 No, si lo decía por si me interesaba...al fin y al cabo, un fichero de base de datos pesa "-0", quizá sería una opcion interesante si el consumo de datos es poco

1 respuesta
Khanser

#12 Tan interesante que si abren el .jar con el que haces la app pueden pillarte el usuario de la BD y hacerte el mal. Si sigues adelante con esa mala idea, los usuarios de BD que se usen en producción no pueden ser DBA y solo deberían tener acceso a las tablas que deba usar el app en concreto.

1 respuesta
Srednuht

#13 vale, me has asustado lo suficiente como para borrarlo de mi mente.

sigo luchando contra el mundo y tratar de hacerlo por el otro método

2 meses después
forlayo

Si lo unico que quieres es acceder a los datos de tu db en mysql en una web; montate un php con las funciones que devuelvan los datos que tu quieres en forma de JSON, ejemplo:

{
  "locations": {
    "record": [
      {
        "id": 8817,
        "loc": "NEW YORK CITY"
      },
      {
        "id": 2873,
        "loc": "UNITED STATES"
      },
      {
        "id": 1501
        "loc": "NEW YORK STATE"
      }
    ]
  }
}

Y desde android llamas a tu web y sacas los resultados.

Imagino que necesitas seguridad, para esto puedes usar:

Yo prefiero la segunda.

Un saludo y de miedo nada que eso es una poyada :)

1
C

#1, aunque veo que es un hilo antiguo, te voy a responder. Y lo voy a hacer sobre todo porque yo tuve la misma duda y acabe hasta los mismísimos cojones (con perdón de los foreros) de que la gente en vez de responder a la pregunta con el puto webservice (que ya sabemos todo cristo que esto se hace con un webservice), no me respondiera a la pregunta que yo (en este caso tú) estaba haciendo.

Ahora mismo estoy trabjando en mi proyecto bonito en Android pegando directamente contra mysql y con jdbc (interno, para la empresa, para un puñado de usuarios que si pierden su smartphone no me van a exigir resonsabilidades. Y no admito debate sobre este asunto). Sí, lo sé, soy cutre, un inútil, un despreciable de la naturaleza. Soy el joselito de los programadores, el fronterizo de las líneas de código. Ok, pero yo y sólo yo, amigo #1, te voy a responder a tu pregunta como en ningún foro por internet te han respondido. No sólo te voy a advertir y te voy a dar una alternativa. Es que te VOY A RESPONDER A TU PREGUNTA. Se ve que hay mucho consultor en la sala, pero poca gente que te de la "droja" que pides.

Ahí va un pantallazo que resume todo, amigo mío:

2 1 respuesta
Srednuht

#16 Pese a que es antiguo, como comparto esto con un proyecto para el instituto de robotica de la uni, esto lo tengo un poco abandonado. Asi que me viene de lujo. simplemente muchas gracias por molestarte. De verdad.

Así es como yo tenia pensado conectarlo, con jsp, creando la conexion, cargando los drivers, y a bae de prepared statement , statements y resulsets.

Muchisimas gracias, le echaré un ojo en cuanto tenga un hueco libre.

PD: te quiero<3

1 respuesta
C

#17 de nada tío. Es que si no es crítico el tema de la seguridad, buena gana de estar parseando los xml y montando el webservice de turno. Select y "palante".

1 respuesta
kraneok

#18 De todos modos eso no se podría enviar de alguna manera encriptado?, con certificados SSL u algo?

28 días después
M

Que tal code07 realizando los pasos que describiste en la conexion a mysql me aparece este error "NoClassDefFoundError: com.mysql.jdbc.Driver"

agregue el mysconnector y sigue igual. ,epuedes ayudar porfavor

Gracias

1 respuesta
C

#20 buffff, que mal rollo. Ese mismo error lo he sufrido. Tengo el eclipse tanto aquí como en el curro. Bien, el proyecto que estaba haciendo lo hacía desde casa. Pero un día me lo llevé al curro. Importo el proyecto, lo lanzó y: zas! El error ese que dices.

Googleé y había un cojón de hilos (incluído StackOverflow) donde decía cómo arreglarlo. Que si hay que incluir la ruta donde está el .jar en el classpath. Que si hay que copiar el .jar a la carpeta (jre)/lib/ext, que si... etc. etc. etc.

Probé ochocientas formas y el problema está en que no sé cómo coño se solucionó. Pero vamos, que con Eclipse es el pan nuestro de cada día. El hecho de que exista la opción Project/Clean... lo dice todo.

Joder! no consigo acordarme qué fue lo que lo solucionó, tío. Me da mucha rabia no poder ayudarte, sobre todo cuando he sufrido el mismo infierno. Eso sí, lo solucioné el mismo día pero después de mucho toquetear el build path.

Una pregunta, ¿estás utilizando alguna librería más de terceros tipo greendroid, viewpagerindicator, actionbarsherlock o la android-support-v4? Es que también tuve un problema por una incompatibildad de la android-support-v4 que tenía en un proyecto de terceros que usaba en el mío. Pero no creo que fuera eso lo del fallo del conector jdbc.

Aggg... si me acuerdo de algo te digo. No te queda otra que googlear, probar y estar jodido un rato. Vaya droja mala que te he dao xd

1 respuesta
elkaoD

#21 hombre, la opción Project/Clean viene muy bien.

Lo malo es que en Eclipse 9 de cada 10 veces la pulsas porque se ha petado el proyecto xD

Aún recuerdo una práctica de AppEngine, qué mal lo pasé.

MTX_Anubis

Que va hombre si según muchos de aquí eclipse es el mejor IDE que existe para programar porque lo usaban en proyectos presupuestados en 5 millones de €, en fin... xD

Los jar que incluyas deben ir en /libs y se añaden automaticamente al classpath. Si tenías un proyecto con una verisón anterior del plugin de Android para eclipse (antes de que se añadieran automaticamente, había que añadirlos a mano con "add to build path") y has actualizado dicho plugin, bien, elimina todas las dependencias que tengas "android dependences" menos la de annotations vaya, y pon todos tus jars en "/libs". Si aún así te da problemas, directamente crearía otro proyecto y copiaría los sources y añadiría los jars de esta manera.

pdj

Mini tutorial, hablas de JSP asi que tienes java por ahí, bien, vamos a crear un webservice:

Recomendado:

1º Instalas netbeans

Manos a la obra:

1º Te creas un nuevo proyecto maven con arquetipo webapplication. (o usas el tuyo)
2º abres el pom.xml y le añades lo siguiente:

<dependencies>
         ...
        <!-- JERSEY -->
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-server</artifactId>
            <version>1.8</version>
        </dependency>
 </dependencies>

Con esto tienes la bonita implementación de JAVAX Jersey.

Bien, con lo anterior podemos crear nuestro webservice. Para ello:

1º Te creas una clase Java tal cual, ponle algún nombre chachi guay tipo ChachiAPI o similar.

2º Añade las notaciones a tu clase tal como en el ejemplo:

@Path("/api")
@Stateless
public class EpistemeAPI {

private static String ALLOWED_DOMAIN = "http://localhost";

/* ========= GET METHODS OF EPISTEME ========= */
/**
 * Method to obtain a single entry
 *
 * @param entryId: The entry id
 * @return Response: The response containing the requested entry
 */
@GET
@Path("/entry")
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces(MediaType.APPLICATION_JSON)
public Response getEntry(@QueryParam("entryId") String entryId) {

    EntityManagerFactory emf = Persistence.createEntityManagerFactory("manager1");
    EntityManager em = emf.createEntityManager();
    Entries entry = (Entries) em.createNamedQuery("Entries.findByIdEntries").setParameter("idEntries", entryId).getSingleResult();
    Response customResponse = Response.ok(entry, MediaType.APPLICATION_JSON).
            header("Access-Control-Allow-Origin", ALLOWED_DOMAIN).build();
    return customResponse;
}
}

Ejemplo de POST:

 @POST
    @Path("/entry/new")
    @Consumes({MediaType.APPLICATION_FORM_URLENCODED, MediaType.APPLICATION_JSON})
    public Response newEntry(@FormParam("userId") String userId, @FormParam("entityId") String entityId, @FormParam("entryComment") String entryComment) {
        String response = "HOLA QUE TAL ESTO ES UNA PRUEBA";
        Response customResponse = Response.ok(response, MediaType.APPLICATION_JSON).
                header("Access-Control-Allow-Origin", ALLOWED_DOMAIN).build();
        return customResponse;
    }

3º Resuelve las dependencias para que no explote, más o menos usarás las siguientes (siempre javax.loquesea):

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.ws.rs.Consumes;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

4º Para las respuestas usa lo mismo que usas para "nutrir" a tus JSP, clases de mapeo de bd o lo que quieras, en eso estoy usando JPA en un intento fallido por usar Hibernate pero whatevs es un "stub"

Con lo anterior, tendrás una API de servicios REST que responderá a http://tuservidor/tucontexto/api/elmetodomolon.

Eso es tan chachi guay que te genera JSON molones sin tener que hacer "nah", simplemente devuelve tu lista de items, tu objeto login, lo que te plazca y debería tirar, obviamente en la práctica no lo hará asi que no dudes en preguntar.

P.D: No le hagas caso a los header, eso es una historia para el xdomain (CORS).

Ojalá te sirva!

3 1 respuesta
B

#24 buen aporte.

1 respuesta
pdj

#25 gracias, el post era bastante antiguo, pero si a alguien le sirve o tiene mas dudas encantado de echar una mano :)

1 1 respuesta
4 meses después
R

Hola a todos, necesito ayuda para sincronizar datos desde sqlite a mysql, me explico. suponiendo que tengo una aplicación corriendo en un android y que esta aplicación almacene los datos correspondiente en sqlite y mediante alguna opción que envíe los datos recopilado en sqlite a mysql que se encuentra en un servidor dedicado.

1 respuesta
Srednuht

#26 Se me olvidó agradecertelo infinito en su momento. Estoy siempre hasta arriba U_u, de verdad muchas gracias :)

1 respuesta
pdj

#28 nada un placer, cualquier cosa, pregunta :)

kraneok

#27 Si la información que quieres enviar a MySQL remoto no es gran cantidad, es mejor ahorrarte código y hacer el envío directamente, puesto que no creo que sobrecarge la base de datos, si no, pues crea un servicio controlado por tiempo y que este vuelque la información cada cierto tiempo.

Usuarios habituales