martes, 13 de mayo de 2014

WebService: Conexiones a Mysql desde Android. PARTE 3 (Update).

Buenas amigos, vamos a continuar con el tema de los WebService. En entradas anteriores veíamos como insertar datos en nuestra base de datos mysql (PARTE 1) y posteriormente como mostrar los datos, de nuestra base de datos, en nuestra aplicación (PARTE 2). Ahora, en esta nueva entrada, vamos a ver como actualizar los registros de nuestra base de datos.



Bien, primero voy a modificar mi archivo xml para que quede de la siguiente manera:



Bueno, creamos un método para conectar con nuestro webservice:


Veamos, este método es exactamente igual que el método insertar de la PARTE 1, lo único que cambia es la url del servidor. Veamos:
  • Implementamos las clases con las que vamos a trabajar:
    • HttpClient httpclient=new DefaultHttpClient();
    • HttpPost httppost=new HttpPost("URL DE NUESTRO WEBSERVICE EN EL SERVIDOR")
      • Yo tengo puesto la ip local de mi pc, ya que si ponemos localhost o 127.0.0.1, el dispositivo va a buscar su propio localhost, el que va incluido en el móvil, y puede crear errores, lo mejor si estas probando, la ip local de tu pc. Si utilizas el emulador que trae el eclipse SDK android, tendrás que poner 10.0.0.2, ya que si no te dará fallo.
  • List nameValuePairs=new ArrayList(4);
    • En este caso le damos a nuestro ArrayList un tamaño (4) ya que son el número de variables con las que vamos a tratar, si quieres utilizar 3, pones 3, y así sucesivamente.
  • Ya tenemos nuestras clases preparadas, ahora vamos a almacenar los datos de nuestros EditText en nuestro ArrayList:
  • nameValuePairs.add(BasicNameValuePair("dni", dni.getText().toString().trim()));
    • Bien, esto no tiene mucha historia, almacenamos objetos de BasicNameValuePair con una variable y el valor que va a tener que le pasamos por constructor. Agregamos a nuestro ArrayList un objeto de este tipo según el tamaño que le hayamos dado.
  • Una vez almacenados los datos, le pasamos el ArrayList a nuestra clase HttpPost para que lo codifique:
  • httppost.setEntity(new UrlEncodeForEntity(nameValuePairs));
  • Bueno, una vez que lo tenemos codificado con la url del webservice y la información de nuestro ArrayList, hacemos que HttpClient lo envíe:
  • httpclient.execute(httppost);
Ahora vamos a ver como trabaja nuestro WebService:


  • Rellenamos las variables del localhost con la información de nuestro servidor:
    • Hostname: Nombre del host.
    • Database: Nombre de nuestra base de datos.
    • Username: Nombre de usuario del servidor.
    • Password: Contraseña del servidor.
  • Posteriormente, con los datos de servidor que hemos introducido, le pedimos que conecte al servidor y almacene la respuesta en otra variable:
    •  $localhost=mysql_connect($hostname_localhost,$username_localhost,$password_localhost)
      • Si no puede conectar enviara un informe de error
    • or trigger_error(mysql_error(),E_USER_ERROR);
    • Una vez conectado al servidor, buscará nuestra base de datos y se conectará:
      • mysql_select_db($database_localhost, $localhost);
    • Posteriormente, y una vez encontrada la base de datos, obtendrá las variables que le pasamos por nuestra aplicación y las almacenará en otras variables que pueda manejar mejor.
      • $nombre=$_POST['nombre'];
      • $dni=$_POST['dni'];
      • $telefono=$_POST['telefono'];
      • $email=$_POST['email'];
        • Daos cuenta de que los nombres entre comillas simples se llaman igual a las variables que les pasamos por nuestra app.
    • Almacenadas las variables, introduce los valores en un sentencia sql para realizar una consulta al servidor:
      • $query_search = "update personas set nombre='".$nombre."', telefono='".$telefono."',email='".$email."' where dni='".$dni."'";
        • Cuidado con las comillas simples y dobles, que puede ser un follón jeje.
    • Finalmente, y si todo ha ido bien, realizará la consulta a nuestro servidor, el cual, en caso de fallar la sentencia, nos enviará un informe de error.
      • $query_exec = mysql_query($query_search) or die(mysql_error());
      • Cerramos la conexión.
        • mysql_close($localhost);
      Antes de ir con nuestra AsyncTask, voy a crear un método que no podamos modificar el campo dni, ya que lo utilizo como primary key:


      Lo que hace este método es recorrer nuestro ArrayList listaPersonas comprobando el campo dni de cada persona, si el dni de nuestro campo EditText dni coincide con el campo dni del objeto personas, devuelve true, por lo que podrá actualizar nuestro registro, en caso de que no coincida, mostrará un Toast comunicando que no puede modificar el registro (porque nuestro dni no existe en la base de datos) y nos devuelve false.

      Ahora si, vamos a ver nuestro AsyncTask:


      Bien, en el método doInBackground creamos una condición if, en el cual introducimos como condición el método update() si se los datos han sido actualizados, el método nos devuelve true y nos muestra un Toast con el éxito de la operación y limpiando nuestro formulario, todo esto debe correr en un hilo ya que si no bloquearía nuestro AsyncTask y nos funde a errores, si los datos no han podido ser actualizados, el método update() nos devolverá false, y nos mostrará un Toast corriendo en un hilo.

      Bueno, solo nos queda darle una acción a nuestro botón actualizar:


      Como nuestro botón insertar, primero comprueba que no haya campos vacíos, posteriormente, y si los campos no están vacíos, comprueba que exista el dni, y si todo ha ido bien, nos ejecuta nuestro código update, si no, nos mostrará por pantalla un Toast con el tipo de error.

      Bien amigos, hasta aquí la opción para actualizar los registros de nuestra base de datos.

      Aquí os dejo el .xml, la clase y el phpWebServiceCodeExamplePARTE3

      Continuaremos con la PARTE 4.

      Un saludo.

      7 comentarios:

      1. Las opciones de borrar y actualizar se podrían hacer mejor con JSON tal y como nos enseñaste en la versión de mostrar datos?
        Un saludo.

        ResponderEliminar
        Respuestas
        1. Si, totalmente.

          Mi idea era crearlos en primera instancia de una manera que se pudiese entender para posteriormente realizarlos con JSON que es la forma más correcta, no digo que hacerlo sin JSON sea erróneo, pero JSON es mas correcto y a la larga más fácil, aunque hacerlo de inicio puede llevar a confusión a más de uno, por esa razón primeramente los hice sin JSON.

          Un saludo.

          Eliminar
        2. Muchas gracias por tu respuesta. ¿Y tienes pensado realizar los tutoriales de borrar y actualizar con JSON?

          Eliminar
        3. Pensado está, el problema reside en mi falta de tiempo. A parte de mi trabajo en el que paso 12h al día (8:30 a 20:30) estoy trabajando en una start up, si a eso le sumas el tiempo que le dedico a la familia....pues al final me quedo casi sin dormir xD

          En resumen, ¿tengo pensado hacerlo? SI ¿Cuando? PFFFFF ni idea.

          Si necesitas algún tipo de ayuda con algún asunto u orientación puedes mandarme un email a bartolomeabellan@gmail.com y si te puedo ayudar con cualquier cosa, no dudes que lo haré.

          Un saludo.

          Eliminar
        4. Jajajaja ya te entiendo, al final tiempo libre cero...

          Muchísimas gracias por tu amabilidad! Pues si me quedo atascado te molestaré un poquito! Un abrazo!

          Eliminar
      2. Hola espero estes bien.
        Mira enlazar todos los datos de php a android super (la base de datos del servidor), ahora bien tengo una complicacion, quisiera que todos los datos guardados en offline en Android mandarlos al servidor, no uno por uno, si no todos de golpe o actualice los datos en el servidor(base de datos) esto siempre lo he tenido lamentablemente no soy un experto y ando aprendiendo poco a poco, podrias ayudarme a resolver esta duda, buenos tutoriales buen blog

        ResponderEliminar
      3. tengo un error con libros p = listalibros.get(i); me dice cannot convert from object to libros

        ResponderEliminar