Android + PHP + MySQL

FuckYeah

Recurro a vosotros porque soy totalmente nuevo...

Antes de decir que si soy nuevo en desarrollo Android para qué me pongo con esto, pues esque empecé de prácticas y esta es la primera tarea que me han dado...

Objetivo de la tarea:
Aplicación móvil con base de datos local (SQLite) que sincronice, cuando el usuario lo precise, los datos almacenados en SQLite con MySQL.

Bueno, después de una semana de tutoriales 8 horas al día.. Trabajar con Android Studio ha sido una maravilla hasta que llegué a lanzarme en establecer conexión con la Base de Datos de la empresa...
No lo consigo por mérito propio bajo ningún concepto... Creo que mi problema es la desinformación sobre JAVA ya que yo estudié PHP, html, css, python y shell script y en la empresa me dan tareas de JAVA.
Cuando sigo tutoriales veo que utilizan HttpClient, cosa que ya está obsoleta y me niego a implementar en el proyecto. No encuentro NADA simple sobre establecer un simple LOGIN a MySQL sin usar HttpClient.

Me he vuelto loco buscando tutoriales sobre REST y no hay nada básico, hay uno que, sinceramente, no entiendo nada.

¿Qué debo utilizar? ¿Qué debo buscar? No sé, ando muy perdido para hacer una conexión a través de PHP y no creo que sea tan difícil. Tengo programada la conexión a la BD en PHP devolviendo los resultados con json_encode() pero no soy capaz a que Android interprete eso...

CrIpI

Yo utilizo json para la comunicacion con el servidor.

1 respuesta
FuckYeah

#2 Podrías darme un pequeño ejemplo de cómo mandas una petición HTTP desde JAVA a PHP?

A partir de ese ejemplo me busco la vida, pero es que no encuentro nada.. Todo es HttpClient ... = DefaultHttpClient(); y eso Android Studio me lo tacha y no me deja compilarlo.

2 respuestas
CrIpI

#3 Estoy mirando el codigo y es HttpClient. Cual es el problema de utilizarlo?

Lecherito

#3 Php o lo que tengas en el server -> devuelve json -> java lee json y lo convierte a un objeto java (con cualquier librería de json, gson por ejemplo) -> java utiliza el objeto para hacer lo que tengas que hacer

Lueog ya como java lea los datos de esa pagina web (restful service) es otra cosa y tu duda no queda clara la verdad.

1 respuesta
Fyn4r

El problema parece ser que no es HttpClient, es el DefaultHttpClient, en stackoverflow (2 entrada en google por cierto) dicen de usar HttpClientBuilder

1 respuesta
FuckYeah

http://hc.apache.org/httpclient-3.x/

En el primer apartado dice que ya no tiene soporte y tal...

#6 Lo probé y Android Studio no me reconoce eso.

Se supone que hay que usar HttpComponents --> http://hc.apache.org/ pero mi problema es que yo sigo tutoriales dado mi pésimo nivel y no hay NINGUNO.

#5 Eso lo tengo claro y hay infinita documentación de cómo hacerlo y tal. El problema surge cuando pones HttpClient var = DefaultHttpClient(); que aparece TACHADO en Android Studio y si pones el ratón encima dice claramente DEPRECATED (que viene a ser OBSOLETO) a partir de la API 22.

1 respuesta
CrIpI

#7 El de las plataformas de mi curro dice de usar Clase urlconnection

1 2 respuestas
FuckYeah

#8 Buah gracias, voy a indagar!

MTX_Anubis

Sinceramente, no es muy dificil escribir "android http request example" en google. El HttpClient estaba bugeado de hecho, ya no recuerdo que era lo que le pasaba pero fallaba al leer algunas request.

Mira aquí

This class was deprecated in API level 22.
Please use URLConnection and friends instead. The Apache HTTP client is no longer maintained and may be removed in a future release. Please visit this webpage for further details.

Y un ejemplo hecho con Volley https://developer.android.com/training/volley/simple.html

1 2 respuestas
FuckYeah

#10 Gracias, de verdad, no me gusta abusar de MV para tonterías así de googlear, pero os prometo que he estado HORAS sin saber qué búsquedas realizar, cuando uno no tiene ni idea... tonterías así no salen.

Voy a ponerme a ello.

Gantorys

Cojo sitio porque estoy buscando algo parecido aunque no controlo de programación móvil, leí esto que parece estar bien:

http://loopj.com/android-async-http/

1 respuesta
FuckYeah

#12 Header[] está obsoleto.

Hexar

https://developer.android.com/training/building-connectivity.html

En esa pagina tienes posiblemente ejemplos de practicamente todo , con la posibilidad de bajarte el source code y demás. De todas formas olvidate de mantener "sesiones" en el servidor o lo que sea en Android , deberás construir WebServices en los que obtener toda la informacion y tratarla en el movil ,donde a posteriori la vuelvas a enviar para procesarla en el Servidor ya con PHP y MySQL.
Gson es una buena libreria para serializar los JSON a objetos, igual que Jackson , puedes probar cualquiera de las 2.
Por cierto ,prueba Volley , es la manera "recomendada" por Google aunque parezca muy denso al principio ya que te va a facilitar todo el trabajo de controlar las conexiones y centrarte en las peticiones y respuestas
https://developer.android.com/training/volley/simple.html

1 respuesta
FuckYeah

#14 Muchas gracias! Toda documentación es bienvenida.

Gracias a #8 y #10 conseguí lo que dices, la idea no es mantener sesión sino realizar una consulta MySQL e interpretar los datos en el cliente Android. Mi problema es que siguiendo los tutoriales me funciona de 10, pero al no tener nivel no soy capaz a modificar la consulta y realizar un PARSER JSON por mí mismo. Ahora estoy luchando contra este bache, poco a poco.

GSON es más sencillo que JSON? o sigo "entendiendo" la estructura y funcionamiento de JSON para luego pasarme a GSON?

1 respuesta
Hexar

JSON en java es una basura teniendo las librerias que hay ,GSON y Jackson son ambas recomendables y faciles de usar.
Yo he usado ambas y te irán bien las 2. Te permite "serializar" el objeto directamente a JSON ,quizá sea un poco difícil a la hora de mapear las listas pero si te ayuda , yo en los web services que he llevado a cabo para devolver cualquier cosa y permita devolver tanto 1 como N resultados suelo crear un Objeto con simplemente un ArrayList<> del objeto que quieras mapear y prou.
Como dato yo prefiero Jackson al usar anotaciones me pareció mas fácil e intuitiva,ademas que permite que llames al campo como quieras. Por ejemplo en mi caso

public class ExpedicionJSON {
	
@JsonProperty("lista")
private List<Expedicion> lista;

}
public class Expedicion  {

@JsonProperty("excaApell21")
private String excaApell21;

@JsonProperty("excaNombre2")
private String excaNombre2;

@JsonProperty("excaApell12")
private String excaApell12;

@JsonProperty("excaApell22")
private String excaApell22;
}

Y para leer la respuesta

final ObjectMapper mapper = new ObjectMapper();
        return mapper.readValue(sb.toString(), ExpedicionJSON.class);

Donde sb seria ( en mi caso ) el contenido de la respuesta en formato JSON directamente.
Como puedes observar leo la lista directamente y automaticamente me lo parsea todo, además jackson te permite incluir en las anotaciones algun parametro
para añadir campos que no se serializen y demás. Obviamente mi código está bastante recortado pero te lo he dejado para que veas un poco el concepto de las anotaciones en Jackson y como deserializar una respuesta JSON

Lecherito

#15 Gson es una librería para parsear Json, no son cosas distintas xd

FuckYeah

Ya que me quoteas.. No entiendo los parser ni JSON ni GSON ni Jackson ni nada.. No le encuentro la lógica.. Hoy he estado 6 horas y nada.. No consigo recibir los datos satisfactoriamente. Recibir sí, pasarlos a variables java ni de coña.

Ya conseguí establecer conexión con HttpURLConnection ahora sigo atascado con el puto parser xD

1 respuesta
Lecherito

#18 Pues es muy facil

{
"name": "nombre1",
"edad": 1
}
public class Persona {
  String name;
  int edad;
}

Y para psar de Json a java:

Persona persona = new Gson().fromJson(jsonString, Persona.class);
1 respuesta
babri

llego tarde a la fiesta pero te recomiendo retrofit los HttpConnections a veces se quedan tostados.

1 1 respuesta
FuckYeah

#19 dios mío, voy a probarlo ahora mismo, eso sí que tiene lógica! Los scripts que he visto eran muy exagerados xD

FuckYeah

Nada,hoy ya me he agobiado...

Al tocar cosas se ha jodido el proyecto entero...

Lo del parser no sé relacionarlo ni usarlo ni nada... Parecía fácil pero no.

Yo no entiendo porqué me meten a hacer esta puta mierda si yo se de php no de java.

Yo quiero deserialiZar esta mierda a dos variables java:

[{"Usuario":"Fuckyeah","ID":"1"}]

Y me como los mocos 8 horas al día.

3 respuestas
Hexar

#22 Estás seguro de que lo estás recibiendo bien? Con GSON tal como te ha indicado lecherito deberia deserializartelo correctamente siempre y cuando llames a los campos del objeto a recibir tal como pones tu ,es decir usuario e id , no se si es case sensitive , es posible por que GSON creo que usa la reflexion por lo que tirara de .equals de String que no es case Sensitive en ese caso deberias llamar las variables Usuario e ID ,algo poco ortodoxo llamar a los campos de un objeto con mayusculas iniciales pero bueno.
Por cierto si no dominas de Java aprende Java antes de ponerte con conceptos como este , y usa stackoverflow sabiamente ,mas informacion de java que alli solo se me ocurre en la documentacion oficial xD

1 respuesta
FuckYeah

#23 No estoy seguro de nada, no sé ni comprobarlo... Yo lo que necesito es acabar las prácticas ya y volver a lo mío, sistemas. XD

1 respuesta
Lecherito

#22 Es que eso no se puede deserializar a "dos variables java", eso se deserializa a un objeto que contiene esas dos propiedades con esos nombres exactos, y si le quieres poner otro nombre puedes usar anotaciones para saber con que nombre se ha de serializar/deserializar.

Prueba a poner System.out.println(new Gson().fromJson(texto, Map.class));

Si eso ya no te funciona hay algo que estás haciendo muy mal

1 respuesta
Soltrac

#24 Con esa actitud en este mundo vas a ser un 0 a la izquierda, ponte las pilas que te están dando la respuesta aquí.

Si eres bueno en esto, te tiene que dar igual que te cambien la tecnología, debes adaptarte.

1 respuesta
FuckYeah

#25 el lunes mismo hago un proyecto nuevo y hago todo tal cual me has ido explicando, si no m sale te pongo el código a ver cuál es mi fallo. Y digo el lunes porque tengo todo ahí, en el curro.

#26 pero tío, si yo he estudiado sistemas y robótica. Me ponen en esta empresa porque era el mejor en programación de mi promoción y me encuentro que, en vez de sistemas o páginas web, me piden JAVA para Android.. Eso es otra FP muy distinta a las que yo he dado... Si yo me manejo con variables y me encuentro el mundo de la orientación a objetos que me trastorna. Lo peor es la presión que me meten porque JAVA es precioso y me está encantando pero me piden una puta app de la ostia y me rallo..

1 respuesta
Soltrac

#27 y tienes toda la razón pero una vez fuera verás q no puedes dedicarte a lo q has estudiado. Mis prácticas fueron en un lenguaje de programación q no había visto en mi vida con un gestor de base de datos desconocido y con Internet, stackoverflow y demás acabaron contratándome.

No desesperes que lo vas a sacar y la experiencia siempre es positiva. No te estanques en lo que estudiaste y ya está

1 respuesta
FuckYeah

#28 Gracias por los ánimos, el lunes vuelvo a por todas. Ya he buscado los tutoriales que más se adaptan a mi aplicación a ver qué saco.

babri

#22 que tipo de variable es??? Si es un String lo que tienes uqe hacer es un:

JSONObject tu_variable_json = new  JSONObject(tu_string_a_convertir);

String usuario = tu_variable_json.getString("Usuario ");
String id= tu_variable_json.getString("ID");

Ten cuidado que si es un array de json tienes que hacer un JSONArray y no un JSONObject.

Esto va incluido en Android no tienes que instalarte nada.

Aunque la verdad es que GSON es una maravilla.