¿Cual es la forma de trabajar con un JSONArray para rellenar una tabla con una base de datos?

publicado por: Anonymous

Estoy usando un objeto JSONArray en una aplicación de Android para rellenar una tabla dinámicamente con lo obtenido en la consulta. El problema es que hasta ahora estaba trabajando con un JSONObject, con el cual la tabla se rellenaba, pero lo hacía sólo con la última consulta obtenida, por lo que no me servía para que la aplicación funcionara de forma óptima.

El código que he improvisado para obtener la consulta, al menos para empezar a hacer pruebas es el siguiente (Editado según la respuesta de Pablo Simon DiEstefano):

Response.Listener<String> responseListener = new Response.Listener<String>(){
                @Override
                public void onResponse(String response){
                    try {

                        JSONArray jsonArray = new JSONArray(response);
                        String hora_inicio, hora_fin, fecha, nombre, apellidos, prestacion;
                        for (int i = 0; i < jsonArray.length(); i++) {
                            JSONObject jsonObject = jsonArray.getJSONObject(i);
                            hora_inicio = jsonObject.getString("hora_inicio");
                            hora_fin = jsonObject.getString("hora_fin");
                            fecha = jsonObject.getString("fecha");
                            nombre = jsonObject.getString("nombre");
                            apellidos = jsonObject.getString("apellidos");
                            prestacion = jsonObject.getString("prestacion");

                            String[] arrayRespuesta = {hora_inicio, hora_fin, nombre, apellidos, prestacion};

                            int[] comprobarFecha = separarFecha(fecha);
                            TablaPacientes tabla = new TablaPacientes(Usuario.this, tablePaciente);
                            if (comprobarFecha[0] == calendario.getYear() && comprobarFecha[1] == calendario.getMonth() + 1 && comprobarFecha[2] == calendario.getDayOfMonth()) {
                                //tablePaciente.removeAllViews();
                                tabla.agregarCabecera(R.array.tabla_pacientes);
                                cargarTabla(tabla, arrayRespuesta);
                            } else {
                                tablePaciente.removeAllViews();
                                Toast t = Toast.makeText(getApplicationContext(), "Año" + comprobarFecha[0] + "Mes" + comprobarFecha[1] + "Dia" + comprobarFecha[2], Toast.LENGTH_LONG);
                                t.show();
                            }
                        }
                    }catch(JSONException e){
                        tablePaciente.removeAllViews();
                        Toast t = Toast.makeText(getApplicationContext(), "No hay pacientes para esta fecha", Toast.LENGTH_LONG);
                        t.show();
                    }catch(ArrayIndexOutOfBoundsException e){
                        tablePaciente.removeAllViews();
                        AlertDialog.Builder builder = new AlertDialog.Builder(Usuario.this);
                        builder.setMessage("Error de excepción en el array "+e.getLocalizedMessage())
                                .setNegativeButton("Retry", null)
                                .create().show();
                    }
                }
            };
    RegisterRequest registerRequest = new RegisterRequest(username, password, fecha, responseListener);
    RequestQueue queue = Volley.newRequestQueue(Usuario.this);
    queue.add(registerRequest);

Con este código la aplicación me da un error, si bien no es ningún error de programación. Al iniciar lo que en teoría me tendría que dar son dos tablas, una detrás de la otra, por cada resultado de la consulta. Sin embargo, la primera vez que pulso una fecha, me sale lo siguiente

introducir la descripción de la imagen aquí

Eso que sale es la tabla correspondiente a la segunda consulta, y una cabecera extra. Sin embargo, cuando vuelvo a pulsar la fecha una segunda vez, me sale lo siguiente:

introducir la descripción de la imagen aquí

No se aprecia muy bien por el tamaño del dispositivo, pero en ese momento me sale el primer resultado (la primera tabla junto con la cabecera) más una tabla con el primer resultado, el segundo y de nuevo una cabecera

¿Alguna idea de cómo se podría solucionar esto?

Este es el resultado de mi JSON

[
    {
        "us_usuario": "DONATE",
        "us_clave": "DONATE",
        "hora_inicio": "18:20",
        "hora_fin": "18:35",
        "fecha": "2017-10-29",
        "nombre": "JUAN MANUEL",
        "apellidos": "LLORENTE RODRIGO",
        "prestacion": "REVISION OFTALMOLOGICA"
    },
    {
        "us_usuario": "DONATE",
        "us_clave": "DONATE",
        "hora_inicio": "14:00",
        "hora_fin": "14:15",
        "fecha": "2017-10-29",
        "nombre": "JACINTO",
        "apellidos": "JARAMILLO ROMERO",
        "prestacion": "FOTOCOAGULACION DR"
    }
]

solución

Creo que el error te viene de esta línea:

String [] arrayRespuesta = new String[jsonArray.length()-3];

Si te fijas, jsonArray es de longitud 2:

jsonArray[0] = {
    "us_usuario": "DONATE",
    "us_clave": "DONATE",
    "hora_inicio": "18:20",
    "hora_fin": "18:35",
    "fecha": "2017-10-29",
    "nombre": "JUAN MANUEL",
    "apellidos": "LLORENTE RODRIGO",
    "prestacion": "REVISION OFTALMOLOGICA"
}

jsonArray[1] = {
    "us_usuario": "DONATE",
    "us_clave": "DONATE",
    "hora_inicio": "14:00",
    "hora_fin": "14:15",
    "fecha": "2017-10-29",
    "nombre": "JACINTO",
    "apellidos": "JARAMILLO ROMERO",
    "prestacion": "FOTOCOAGULACION DR"
}

Con lo cual, al hacer:

String [] arrayRespuesta = new String[jsonArray.length()-3];

Estás haciendo un array de -1 posiciones, lo cual no es correcto.

Para obtener los datos lo puedes hacer de la siguiente manera:

Response.Listener<String> responseListener = new Response.Listener<String>(){
            @Override
            public void onResponse(String response){
                try{
                    String hora_inicio="", hora_fin="", fecha="", nombre="", apellidos="", prestacion="";
                    JSONArray jsonArray = new JSONArray(response);
                    for (int i=0; i<jsonArray.length(); i++){
                        JSONObject jsonObject = jsonArray.getJSONObject(i);
                        hora_inicio = jsonObject.getString("hora_inicio");
                        hora_fin = jsonObject.getString("hora_fin");
                        fecha = jsonObject.getString("fecha");
                        nombre = jsonObject.getString("nombre");
                        apellidos = jsonObject.getString("apellidos");
                        prestacion = jsonObject.getString("prestacion");

                    String[] arrayRespuesta = {hora_inicio,hora_fin,nombre,apellidos,prestacion};

                    int[] comprobarFecha = separarFecha(fecha);

                    if (comprobarFecha[0] == calendario.getYear() && comprobarFecha[1] == calendario.getMonth()+1 && comprobarFecha[2] == calendario.getDayOfMonth()){
                            tablePaciente.removeAllViews();
                            TablaPacientes tabla = new TablaPacientes(Usuario.this, tablePaciente);
                            cargarTabla(tabla, arrayRespuesta);
                        } else {
                            tablePaciente.removeAllViews();
                            Toast t = Toast.makeText(getApplicationContext(), "Año"+comprobarFecha[0]+"Mes"+comprobarFecha[1]+"Dia"+comprobarFecha[2], Toast.LENGTH_LONG);
                            t.show();
                        }
                    }  //El for lo acabamos aquí para que en cada iteración meta un elemento
                }catch(JSONException e){
                    tablePaciente.removeAllViews();
                    Toast t = Toast.makeText(getApplicationContext(), "No hay pacientes para esta fecha", Toast.LENGTH_LONG);
                    t.show();
                }catch(ArrayIndexOutOfBoundsException e){
                    AlertDialog.Builder builder = new AlertDialog.Builder(Usuario.this);
                    builder.setMessage("Error de excepción en el array "+e.getLocalizedMessage())
                            .setNegativeButton("Retry", null)
                            .create().show();
                }
            }
        };
        RegisterRequest registerRequest = new RegisterRequest(username, password, fecha, responseListener);
        RequestQueue queue = Volley.newRequestQueue(Usuario.this);
        queue.add(registerRequest);
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *