lunes, 30 de junio de 2014

WebService: Obtener datos mysql desde Android con JSON

Buenas amigos, llevo un tiempo desaparecido ya que estoy realizando un proyecto que, afortunadamente, ya está en fase de testeo, y hasta nueva orden voy a estar un poco parado, así que voy a realizar nuevas entradas y a contestar todos aquellos emails que me han enviado con sus dudas, tengan paciencia les llegará a todos. Dicho esto, estuvimos hablando en un tema anterior como mostrar datos de una base de datos mysql en nuestra aplicación sin utilizar JSON. Bien, en este nuevo tema veremos lo mismo pero utilizando JSON.



Para comenzar, ¿Que vamos a utilizar?:

  • Un servicio Apache con Mysql
  • Un WebService
  • Una clase "Personas" para almacenar datos
  • Una clase Main para ejecutarlo todo.
NOTA: Al final del post os daré los archivos.

Bien, como ya he dicho en temas anteriores no voy a comentar como crear un servicio Apache ya que me quedaría muy extenso el tutorial, buscar en google, hay a patadas.

Antes de continuar decir que voy a trabajar con una tabla "Personas" con 4 campos (dni, nombre, telefono, email).

Comenzaremos creando nuestro WebService:



  • Lo primero es meter 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 nuestro WebService intentará conectar al servidor, enviando un informe de error en caso de no poder conectar:
      •  $localhost=mysql_connect($hostname_localhost,$username_localhost,$password_localhost)
      • or trigger_error(mysql_error(),E_USER_ERROR);
      • Una vez conectado al servidor, intentará conectar con nuestra base de datos
        • mysql_select_db($database_localhost, $localhost);
        • Luego, creamos una sentencia sql para que obtenga todos los datos del servidor.
          • $query_search = "select * from personas order by dni";
          • Ejecuta la sentencia sql:
            • $query_exec = mysql_query($query_search) or die(mysql_error());
          • Creamos una variable llamada "json" que tendrá formato de Array.
            • $json=Array();
          • Creamos una sentencia condicional "if" y le agregaremos el método mysql_num_rows(), al que le pasaremos por parámetro la ejecución de la sentencia sql, comprobando si la tabla está vacía o no.
            • if(mysql_num_rows($query_exec))
          • Si tenemos filas en nuestra tabla, se ejecutará un bucle "while" donde por medio del método mysql_fetch_assoc iremos almacenando las filas en la variable $row
            • while($row=mysql_fetch_assoc($query_exec))
          • Y se lo pasamos a nuestra variable $json para que lo almacene para posteriormente enviárselo a nuestra app.
            • $json['personas'][]=$row;
          • Cerramos la conexión con el servidor
            • mysql_close($localhost);
          • Imprimimos por medio de echo nuestro $json con ayuda del método json_encode.
            • echo json_encode($json);
          Ahora vais a vuestro navegador y comprobáis que funciona, introduciendo la url del "selectAllJSON.php" (así se llama mi webservice).

          En mi caso la url sería: http://localhost/picarcodigo/selectAllJSON.php

          Y lo que me imprime por pantalla sigue el formato JSON:

          {"personas":[{"nombre":"Bartolome Abellan","dni":"55578932Z z","telefono":"555789000","email":"bartolomeabellan@gmail.com"},{"nombre":"cgghj","dni":"ghjj","telefono":"3689","email":"ghjkog"},{"nombre":"ghkjf","dni":"hdguj","telefono":"5699","email":"gghk"}]}

          Bien, ya tenemos listo nuestro WebService con JSON integrado veamos como quedará nuestra app.

          Lo primero es crear una clase "Personas" en las que almacenaremos los datos de cada persona:


          NOTA:No voy a explicar esta clase, si no sabes que hace o cual es su función, debes estudiar más, es algo básico.


          Voy a trabajar en mi app con esta interfaz, la cual pasaré al final del post.

          Bien, ya tenemos nuestro webservice y sabemos con que interfaz trabajar, vamos a ver código java.

          Nuestra clase principal contendrá los siguientes métodos:
          • String mostrar(): Método que realizará la conexión a nuestro servidor por WebService, obteniendo un objeto String como resultado
          • boolean filtrarDatos(): Este método obtendrá el objeto String del método mostrar() y lo filtrará por diferentes clases JSON rellenando objetos de tipo Personas que almacenaremos en un ArrayList. Parece complejo, pero no lo es, ya lo veréis.
          • void mostrarPersonas(int Position): Nos cargará y mostrará los datos de las personas almacenadas en determinadas posiciones de nuestro ArrayList.
          • String convertStreamToString(InputStream is): Este método convertirá objetos de tipo InputStream en objetos de tipo String.
          Todo esto ejecutado desde una clase AsyncTask.


          • Instanciamos HttpClient HttpPost para comunicarnos con nuestro Webservice.
            • HttpClient httpclient=new DefaultHttpClient();
            • HttpPost httppost=new HttpPost("URL DE NUESTRO WEBSERVICE EN EL SERVIDOR");
          • Creamos una variable local de tipo String llamada resultado, esta almacenará la respuesta.
            • String resultado="";
          • Implementamos la interfaz HttpResponse para obtener el resultado de ejecutar httpclient.
            • response = httpclient.execute(httppost);
          • Implementamos la interfaz httpEntity para procesar la respuesta obtenida en HttpResponse.
            • HttpEntity entity = response.getEntity();
          • Utilizamos la clase InputStream para convertir los datos entity a byte.
            • InputStream instream = entity.getContent();
          • Le damos a nuestra variable "resultado" el valor de convertir los bytes de InputStream a String por medio del método convertStreamToString(InputStream is).
            • resultado= convertStreamToString(instream)
          • Finalmente devolvemos nuestra cadena con los datos
            • return resultado;
          Aquí podéis ver lo que hace el método convertStreamToString(InputStream is):


          Este método no lo he creado yo, lo he cogido de internet, los hay a patadas y es la mejor solución para pasar datos de un InputStream a String, es muy sencillo.

           Bien, hemos leído nuestro WebService y hemos almacenado su valor en la variable resultado, ahora vamos a pasarlo ese resultado por nuestro método filtrarDatos().


          • Limpiamos nuestro ArrayList, por si tuviese algo de información.
            • listaPersonas.clear();
          • Creamos una variable de tipo String "data" donde almacenaremos el resultado obtenido al ejecutar la conexión al servidor
            • String data=mostrar();
          • Realizamos una condición "if" por si data está vacío
            • if(!data.equalsIgnoreCase(""))
          •  Creamos un objeto JSONObject donde le pasaremos por constructor la información que obtuvimos de nuestro WebService almacenada en la variable de tipo String "data".
            • JSONObject json = new JSONObject(data); 
          • Posteriormente pasamos JSONObject a JSONArray, indicándole por parámetro el nombre del array de nuestro JSON, en nuestro caso "persona".
            • JSONArray jsonArray = json.optJSONArray("personas"); 
              • Una pequeña pausa, puedes observar en el WebService que he creado que al json le daba un nombre de parámetro:
                • $json['personas'][]=$row;
              • Ese nombre, que va entre comillas simples y corchetes (personas), es la referencia que le hago a JSONArray en su parámetro. Si se llamase coche, yo tendría que poner coche en el parámetro JSONArray.
          • Bien, con esto tendríamos almacenado en JSONArray diferentes objetos JSON, cada uno con la información de cada fila de nuestra tabla, por lo que para ir recorriendo cada uno deberíamos utilizar un for, ya que en su esencia, lo que vamos a hacer es recorrer un array.
            • for (int i = 0; i < jsonArray.length(); i++)
          • Una vez dentro del for, crearemos un objeto de tipo persona con cada ciclo del for
            • personas=new Persona();
          • Crearemos un objeto de tipo JSONObject por cada ciclo, recogiendo así todos los datos que tenemos almacenados en JSONArray.
            • JSONObject jsonArrayChild = jsonArray.getJSONObject(i);
          • Una vez hecho esto, sería ir dándole a cada atributo de personas su correspondiente valor
            • personas.setDni(jsonArrayChild.optString("dni"));
            • personas.setNombre(jsonArrayChild.optString("nombre"));
            • personas.setTelefono(jsonArrayChild.optString("telefono"));
            • personas.setEmail(jsonArrayChild.optString("email"));
          • Fijaos bien que cuando llamo a jsonArrayChild.optString("dni"), le vamos a pasar a personas el valor almacenado en dni, e igual para los otros casos
          • Posteriormente agregamos el objeto personas a nuestro ArrayList
            • listaPersonas.add(personas);
          Con esto ya tendríamos los datos de nuestro servidor almacenados en objetos de tipo personas que a su vez están almacenados en un ArrayList, listos para ser mostrados por pantalla, lo cual haremos con el método mostrarPersona();


          Bien, este método no tiene mucha explicación, leo los objetos almacenados en nuestro ArrayList en la posición que se le pasa por parámetro y lo muestro en los Edittext.

          Para ejecutarlo todo utilizaremos una clase AsyncTask


          Y ejecutaremos nuestro AsyncTask al pulsar el botón mostrar:


          Y, como opcional, para movernos entre nuestro datos, podéis agregar los botones "siguiente" y "previo"


          Lo único que hacen estos últimos es sumar 1 a posición (mas) o restar 1(menos)

          NOTA: Agregar permisos de Internet si no lo tenéis agregado.

          Archivos para descargar: WebServiceJSONExample

          Si tenéis dudas u os atascáis en algo, preguntar.

          Un saludo

          54 comentarios:

          1. ¿Que hace la Clase "Personas"? =)

            ResponderEliminar
            Respuestas
            1. La clase Persona almacena los datos obtenidos por JSON para posteriormente poder hacer con ellos lo que deseemos, de esta forma, realizamos una sola conexión al servidor, obtenemos todos los datos necesarios y lo guardamos en nuestra clase Persona, asi ahorramos tiempo y memoria, ya que si no deberiamos estar conectando todo el tiempo por cada dato que tengamos, con lo que tendriamos que hacer multiples conexiones a servidor, lo que nos consumiria mucho tiempo y recursos de nuestro dispositivo.

              Un saludo.

              Eliminar
            2. Amigo como utilizar todos los datos de la clase persona de una vez. Estoy haciendo un programa que utiliza datos de una base de datos que contiene latitud y longitud, pero al graficarlos solo me grafica un dato, como haría para graficar todos los datos?.
              Este es mi código
              paint.setTextSize(20);
              paint.setAntiAlias(true);
              canvas.drawCircle(ancho/2,alto/2,20,paint);
              canvas.drawCircle(ancho/4,alto/4,20,paint);
              paint.setColor(Color.GREEN);
              canvas.drawCircle(ancho/5,alto/5,20,paint);
              canvas.drawCircle(ancho/6,alto/6,20,paint);


              try {
              for (int i=1;i<=lista.size();i++) {
              paint.setColor(Color.BLACK);
              canvas.drawCircle(Integer.parseInt(com.alonsonunez.servidor3.coordenadas.getLat(i)), Integer.parseInt(com.alonsonunez.servidor3.coordenadas.getLongi(i)), 20, paint);
              }

              }catch (Exception e){
              e.printStackTrace();
              }
              Sería una gran ayuda si me guias como hacer esto.
              Gracias de antemano.

              Eliminar
          2. Muchas gracias por tu publicación me ayudó mucho! saludos desde Ecuador!

            ResponderEliminar
          3. Hola me ha encantado este tutorial, pero no le has dado funcionalidad al boton insertar,update, eliminar...
            Me gustaria que me dijeses como puedo hacer yo algo parecido a lo que haces en el tutorial, lo que querria sería
            ingresar en un edittext un numero y que buscara en la base de datos si esta ese numero y me mostrara solo la fila de ese numero.
            Espero que me puedas ayudar
            muchas gracias desde Alemania!!!!!

            ResponderEliminar
            Respuestas
            1. Buenas, arriba, en el menú, puedes pinchar en "tutoriales avanzados Android", encontraras que tengo realizados el resto de botones pero sin JSON, aún así, miratelos ya que te pueden ayudar mucho a orientarte, no tengo mucho tiempo libre, y aún me faltan infinidad de temas que me gustaría realizar, lo siento.

              Para tu segunda cuestión, puedes seguir 2 caminos:

              1. Crear un webService que obtuviese el dato especifico que le pasas por android y cada vez que quieras buscarlo realizar una conexión y obtener ese dato. El problema de esto es que cada vez que quieras un dato debes realizar una conexión y tu app puede menguar su rendimiento y a consumir mucha batería al estar cada X tiempo conectando a internet.

              2.En vez de realizar un WebService que realice una conexión con cada petición, puedes modificar el código para obtener todos los datos de la DB en una sola conexión y almacenarlos en una colección (como hago yo en mis ejemplos) o en una DB SQLite (android utiliza SQLite para construir DB en el dispositivo). Una vez realizada la única conexión, cada vez que nosotros deseemos un dato solo tendriamos que buscarlo donde lo hayamos almacenado, con lo cual lo hará más rápido y consumirá menos. El problema es que si tenemos una DB enorme, digamos miles y miles y miles de datos, es posible que al almacenar todos esos datos en el dispositivo llenemos la heap y producir un crash en nuestra app.

              Bien dicho esto, si hicieras como yo en este ejemplo, en el que lo almaceno todo en una clase persona, y tu quisieras buscar una persona en concreto por DNI, seria:

              for(i=0;I<ArrayList.size();i++){
              Persona persona=new Persona();
              if(persona.getDni().equalsIgnoreCase(editText.getText().toString())){
              //Si tenemos una coincidencia, realizamos una acción
              }
              }

              En el caso de que te inclines más por hacer una conexión por cada vez qeu quieras buscar un campo, la idea sería utilizar la siguiente sentencia SQL:

              "Select * from database where dni='.$dni.' "

              Donde $dni sería la variable donde nuestro webservice almacenaría el valor dni obtenido de nuestra app.

              Espero haberte orientado un poco, de todas maneras mirate los otros tutoriales que tengo, que, aunque no los tengo realizados con JSON, te pueden orientar.

              Un saludo, suerte.

              Eliminar
            2. Gracias por contestar tan rapido, la cosa es que si que quiero obtener resultados de una base de datos enorme, tiene como 30000 filas. Entonces no veo fiable lo de cargarlo todo en un sqlite. Respecto a la busqueda, no seria mejor hacerlo con una busqueda binaria, si están los datos ordenados? o que algoritmo seria el mejor?
              Estoy empezando con android y estoy un poco perdido.
              Gracias.

              Eliminar
            3. Buenas Juan Ignacio.

              Efectivamente, teniendo tantos registros no es factible almacenarlos en nuestra app, ahora bien, respecto a si hacerlo de una forma lineal o binaria, en este caso es mejor la lineal ¿por que?, bien tu quieres buscar en tu DB un registro de los 30.000, bien, quieres el 2345, por ejemplo, lo metes en tu editext de busqueda y cuando le llega al webservice, la sentencia SQL se encarga de darte ese registro automaticamente, sin pensarselo mucho.

              De todas maneras hablar de busquedas lineales o binarias aqui no tiene mucho sentido, ya que estas se utilizan cuando tu tienes un array o una colección con cientos o miles de datos y tu quieres buscar uno especifico en ellos, y como al tener tu 30.000 registros no los vamos a almacenar en nuestra app, por lo tanto no necesitamos buscar nada, simplemente le enviamos a nuestro webservice que registro deseamos y nos lo devuelve. No se si me he explicado bien...

              Eliminar
          4. hola que tal amigo! Disculpa me podrías ayudar y guiar por favor es que me confundí y ahora no entiendo nada jejeje
            La aplicación que necesito desarrollar obtiene la respuesta del web service con json y debo decodificar la info y guardarla en un array asociativo y de nuevo transformar de nuevo a json para enviar a un archivo javascript, en donde se realiza otras funciones... Por favor me puedes dar una guía de los pasos a seguir? Muchísimas gracias!

            ResponderEliminar
          5. Buenas bEtSii;

            Bien, en este tema tienes explicado como obtener datos en JSON de un WebService escrito en PHP, como decodificar esos datos obtenidos y a guardarlos en una colección (las colecciones son arrays asociativos, que no te confundan).

            Sabiendo esto, nos faltaría volver a pasar nuestra colección a JSON, para ello utilizamos la libreria GSON, que puedes descargar de aqui: http://search.maven.org/#artifactdetails%7Ccom.google.code.gson%7Cgson%7C2.3%7Cjar y la agregas a tu proyecto.

            Bien, suponiendo que tengamos una colección, un ArrayList por ejemplo, el código sería:
            ArrayList list=new ArrayList();
            Gson gson=new Gson();
            String json=gson.toJson(list);
            JSONObjects jObjects=new JSONObjects(json);

            Y ya asi deberíamos de tener nuevamente nuestra colección como un JSON.

            Ahora ya, a partir de aquí, no tengo ninguna idea de como pasar este JSON a un javascript, más que nada porque mis conocimientos en este lenguaje son nulos ya que con la gente que suelo trabajar pasan los datos de PHP a javascript sin pasar por android, es decir, yo cojo con Android y les paso datos al php, y ya ellos con sus conocimientos, cogen esos datos que le han llegado al php y se lo mandan a un javascript, asi que por esa parte, lo siento, no te puedo ayudar, he buscado algo de info por google, pero no he encontrado nada coherente, lo siento.

            Suerte.

            ResponderEliminar
            Respuestas
            1. Bartolomé de verdad muchísimas gracias por tu respuesta, ayuda y sobretodo por tomarte tiempo para contestar mis dudas... De verdad muchísimas gracias... con la info que me has dado he aclarado dudas que tenia y voy a poner en practica... El proyecto que estoy haciendo es para graduarme de la universidad... Seguiré investigando con lo de javascript.... Muchísimas gracias!!!

              Eliminar
            2. buenos tardes, soy de venezuela y me llamo mucho la atencion tu blog porque explicas detalladamente todo, y te felicito y te doy las gracias por regalarnos un poco de tu tiempo y conocimineto, una pregunta con respecto a WebService y el proyecto que creaste como haria en el caso de que quiera colocar luego de que me registre un login de manera de accesar a la informacion, como haria ???..

              Eliminar
          6. buenos tardes, soy de venezuela y me llamo mucho la atencion tu blog porque explicas detalladamente todo, y te felicito y te doy las gracias por regalarnos un poco de tu tiempo y conocimineto, una pregunta con respecto a WebService y el proyecto que creaste como haria en el caso de que quiera colocar luego de que me registre un login de manera de accesar a la informacion...

            ResponderEliminar
          7. hola! saludos desde Honduras. he buscado como hacer el WS y no doi pie con bola. Existe un tutorial de como crear el se utiliza aqui?

            ResponderEliminar
            Respuestas
            1. Buenas, no, no existe, ya que los he creado yo mismo.

              Crea el ws como el que tengo yo aquí en un bloc de notas y al guardarlo le das la extensión .php, luego coges ese archivo y lo guardas en la carpeta htdocs de tu servidor apache, dentro de la carpeta de tu servidor, es decir, dentro de la carpeta htdocs tengo una carpeta "picarcodigo" donde guardo todos los .php que necesito para mi servidor. Luego para acceder a él, solo con poner la url: http://localhost/picarcodigo/miws.php, donde miws es el nombre de tu archivo .php, y ya deberías de tener tu php dentro del servidor, luego te vas a tu código y le pones la url para acceder a él desde android.

              Un saludo, espero haberte ayudado.

              Eliminar
            2. Muchisimas gracias Bartolomé Abellán por el tiempo que te tomas para sacarnos de la ignorancia... logre hacerlo. te felicito por las explicaciones
              Graciaaaaaas!

              Eliminar
            3. aqui de nuevo, salen 2 errores
              en el metodo filtrarDatos
              listaPersonas.add(personas) da el siguiente The method add(String) in the type List is not applicable for the arguments (Personas)
              y el segundo en el metodo mostrarPersona
              Personas personas=listaPersonas.get(posicion) da lo siguiente Type mismatch: cannot convert from String to Personas
              de lo que logro entender de java me dice que "Personas" deberia ser de tipo string. pero segun el codigo es la clase personas que tenemos instanciada. estoy personalizando el codigo para mi app seguro algo se me paso pero no logro encontrar que es. habra problema si cambio el evento setOnClickListener por onTouch? alli tampoco se que paso utilise los mismos controles y aun asi da error cn ese evento....
              Gracias.

              Eliminar
            4. Buenas Vander;

              Te esta diciendo todo lo contrario, al parecer tu List "listaPersonas" solo acepta objetos de tipo String, así que al pasarle un objeto de tipo "Personas", metafóricamente, te lo escupe a la cara jejeje, Para solucionar esto, en tu List, cambia el genérico, es decir, es muy posible que tu tengas algo parecido a esto:

              List listaPersonas =new ArrayList();

              Al ponerle como génerico solo te va a almacenar objetos de tipo String, rechazando el resto y cosiendote a errores, puedes solucionarlo poniendo "Personas" en vez de String:

              List listaPersonas=new ArrayList();

              De esta forma solo aceptará objetos de tipo Personas.

              Un saludo, Suerte.

              Eliminar
            5. List "<"String">" listaPersonas=new ArrayList "<"String">"(); <------Primer Ejemplo, como tu lo tendrás

              List "<"Personas">" listaPersonas=new ArrayList "<"Personas">"();<-----Como debería quedar

              Perdón pero al poner lass flechitas de los genéricos el blog me lo ha interpretado como código y no me lo ha mostrado bien.

              Espero que no te lleve a confusión, las comillas solo son para que el blog no me borre el genérico, tu lo pones sin las comillas

              Un saludo

              Eliminar
          8. Hola, gracias por los tutoriales.
            TE pregunto...como se podría crear un listview y que cuando pulsemos en una persona nos abra un detallado de la misma?
            Gracias y saludos

            ResponderEliminar
          9. En Android me dice que HttpClient está obsoleto, ¿qué otra forma puedo usar?

            ResponderEliminar
            Respuestas
            1. Buenas;
              Lo siento, hace tiempo que no me pongo al dia con Android. Google sacó su nueva API nivel 22, creo, (Version 5.2 creo) y es posible que haya introducido otra forma de hacer este tipo de conexiones, te va a tocar ir a la api de android y ver los cambios que introdujo Google y comprobar como lo hace ahora.

              De todas maneras aunque esté obsoleto sigue funcionando.

              Un saludo, y de verdad que siento no poder ayudarte más.

              Eliminar
          10. hola amigo, he estado siendo tus tutoriales, pero siempre algo me da error :c estaba viendo este, pero veo que no haz implementado las acciones de los botones, pero en tutoriales anteriores lo explicas, es muy distinta la implementacion en este tutorial con json respecto a los otros?

            ResponderEliminar
          11. Buenas un tutorial espectacular.

            Estoy teniendo problemas con la codificacion UTF8, he conseguido que no me devulva $NULL pero ahora las ñ y tildes me las da con caracteres raros, ¿podrias ayudarme?

            un saludo, gracias.

            ResponderEliminar
          12. Hola Bartolomé Abellán.... Sabes he hecho LA Parte de insertar datos de Android a través de un Web Service como lo hiciste, lo hice y funciono muy bien, pero ahora me interesa la parte de este tutorial de poder ver ahora los datos de que están en una base de datos a través del Web Service, pero lamentablemente no puedo lo hice como lo tienes y no me muestra los datos, al contrario me cierra mi emulador, y me marca este error, podrías ayudarme, ya lo he intentado ver por varias ocasiones. De ante mano te agradezco por tu ayuda. Tu servidor.

            05-22 17:23:17.769: W/dalvikvm(351): threadid=1: thread exiting with uncaught exception (group=0x40015560)
            05-22 17:23:17.819: E/AndroidRuntime(351): FATAL EXCEPTION: main
            05-22 17:23:17.819: E/AndroidRuntime(351): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
            05-22 17:23:17.819: E/AndroidRuntime(351): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:257)
            05-22 17:23:17.819: E/AndroidRuntime(351): at java.util.ArrayList.get(ArrayList.java:311)
            05-22 17:23:17.819: E/AndroidRuntime(351): at com.example.prueba2.MainActivity$2.run(MainActivity.java:187)
            05-22 17:23:17.819: E/AndroidRuntime(351): at android.os.Handler.handleCallback(Handler.java:587)
            05-22 17:23:17.819: E/AndroidRuntime(351): at android.os.Handler.dispatchMessage(Handler.java:92)
            05-22 17:23:17.819: E/AndroidRuntime(351): at android.os.Looper.loop(Looper.java:123)
            05-22 17:23:17.819: E/AndroidRuntime(351): at android.app.ActivityThread.main(ActivityThread.java:3683)
            05-22 17:23:17.819: E/AndroidRuntime(351): at java.lang.reflect.Method.invokeNative(Native Method)
            05-22 17:23:17.819: E/AndroidRuntime(351): at java.lang.reflect.Method.invoke(Method.java:507)
            05-22 17:23:17.819: E/AndroidRuntime(351): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
            05-22 17:23:17.819: E/AndroidRuntime(351): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
            05-22 17:23:17.819: E/AndroidRuntime(351): at dalvik.system.NativeStart.main(Native Method)

            ResponderEliminar
            Respuestas
            1. Hola que tal, tengo el mismo error que tu, pudiste resolverlo?

              Eliminar
            2. Hola que tal, tengo el mismo error que tu, pudiste resolverlo?

              Eliminar
            3. Tengo el mismo error , pudiste resolverlo?.

              Eliminar
            4. El problema que nos da aquí es :

              java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0

              Esa exception quiere decir que no se llena el ArrayList, es decir, intentas obtener un objeto, en este caso de tipo Persona, del ArrayList, pero este esta vacio. Lo mejor para que esto no salga es poner una condición if en la que compruebes primero si el ArrayList esta vacio:

              if(!arrayList.isEmpty())

              Con esto no lograras llenar el ArrayList pero si evitaras que salte la Exception. Para llenar tu Arraylist deberas ir a la función correspondiente y ver porque no se llena.

              Lo que yo hago en la función "filtrarDatos()" es obtener los datos del servidor, asociarlos a un objeto de tipo Personas y posteriormente almacenarlo en un Arraylist

              Espero haber sido un poco de ayuda.

              Eliminar
            5. Bartolome, este es mi error

              FATAL EXCEPTION: main
              Process: android.consulta.com.consulta, PID: 32295
              java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.consulta.com.consulta.Clientes.getNombre()' on a null object reference
              at android.consulta.com.consulta.WebServiceExampleJSON$4.run(WebServiceExampleJSON.java:191)
              at android.os.Handler.handleCallback(Handler.java:739)
              at android.os.Handler.dispatchMessage(Handler.java:95)
              at android.os.Looper.loop(Looper.java:135)
              at android.app.ActivityThread.main(ActivityThread.java:5343)
              at java.lang.reflect.Method.invoke(Native Method)
              at java.lang.reflect.Method.invoke(Method.java:372)
              at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905)
              at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)

              Eliminar
            6. Buenas camilo, tu error esta aqui:

              java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.consulta.com.consulta.Clientes.getNombre()' on a null object reference

              estas intentando utilizar Clientes.getNombre() pero getNombre() devuelve un valor null, comprueba que al obtener los datos en Clientes.setNombre(nombre) lo rellenas bien, si no, comprueba que el valor nombre de tu base de datos no sea null.

              Eliminar
          13. Grandioso el tuto...logre insertar datos en mysql con unos de tus tutos...pero ahora ncesito recibir d php una informacion especifica....necesito q el php me envie cualquiera de estos datos q si es "valido" o "invalido" a diferencia de ti solo necesito un valor no un array como lo recibiria en el java de android en un string para luego jugar con el valor retornado...no se si me explico muchas gracias de antemano desde Nicaragua....

            ResponderEliminar
            Respuestas
            1. Puedes hacer que la respuesta sea un array con los valores Estado = 1 mensaje = "Valido" o Estado =2 mensaje = "Invalido"

              Eliminar
          14. Hola Bartolomé......casi todo me va bien a excepción de este error "Only the original thread that created a view hierarchy can touch its views.".....lo he buscado por internet y veo q es un error al modificar algo del MAIN pero no sé como solucionarlo...puedes ayudarme??....graciassss

            ResponderEliminar
          15. Hola bartolome, o alguien que me pudiera ayudar quiero sustraer una imagen desde mysql hacia android , no se como sehace ya que he leido que se tiene que decodificar la imagen para que json la traiga les agradeceria si me ayudarian gracias

            ResponderEliminar
          16. Le doy a "mostrar" en la aplicacion y no me entrega nada, ni error ni nada... porque sera? el webservice si me devuelve los datos pero en la app no me carga

            ResponderEliminar
          17. como se haria la consulta especifica al php se le agrega la linea select * from "tabla" where "tucampo" and "otrocampo"
            en el php se agregan las variables post mi pregunta es como se envian desde el android , lo he intentado pero no logro hacer q las reciba

            ResponderEliminar
          18. hola se puede conectar a la base de datos sin usar json? hay otro tutorial en el que parece que no lo usas http://picarcodigo.blogspot.com.ar/2014/05/webservice-conexiones-base-de-datos.html.

            Saludos, estoy recien empezado a programar

            ResponderEliminar
          19. Este comentario ha sido eliminado por el autor.

            ResponderEliminar
          20. hola amigo se me queda cargando y no me arroja ningun json

            ResponderEliminar
          21. Buenazo me ayudo a full un like !!!!

            ResponderEliminar
          22. $("#divNiveml(data.Espe $("#divNiveml(data.Espe

            ResponderEliminar
          23. Hola, este ejemplo de Web Service ¿es de tipo REST?

            ResponderEliminar
          24. hola queria saver como puedo hacer el service desde java web y meterlos en un objeto json para despues mandarlo a android

            ResponderEliminar
          25. hola queria saver como puedo hacer el service desde java web y meterlos en un objeto json para despues mandarlo a android

            ResponderEliminar
          26. una consulta muy importante ..... es necesario poner la dirección ip para hacer solicitudes usando httppost ?porque cuando pongo en ves de mi ip el localhost no me aparece nada ya deja de comunicarse con la base de datos ..
            httppost= new HttpPost("http://10.127.127.1/webservice/mostrar.php"); // aka se comunica
            httppost= new HttpPost("http://localhost/webservice/mostrar.php"); // aka ya no nada

            ResponderEliminar
          27. Excelente aporte me sirvió de mucha ayuda como referencia, solo una cosa no podrás subir el archivo php a hosting para poder hacer pruebas de consulta para saber mas de como funciona un WebService???....si no es mucha molestia pues....jeje

            ResponderEliminar
          28. Bro me salvaste la vida, llevo todo el día sufriendo hasta que encontré esto, solo ocupé un fragmento de tu código pero me ayudó bastante, quisiera agradecerte, alguna manera de remunerarte al menos un poco por tu código compartido?

            ResponderEliminar
            Respuestas
            1. No te preocupes, con que te sirviese, me doy por agradecido. Suerte.

              Eliminar