Desde Android y en general desde tecnología de desarrollo para móviles, el uso de interfaces o librerías para atacar a bases de datos es totalmente imposible por varias razones:
- La principal es para evitar problemas de seguridad. Un usuario que está más o menos registrado realizaría accesos a la base de datos, al final, lo más importante de las aplicaciones de una forma directa y no controlada
- Escalabilidad y mantenimmiento. Tener el desarrollo preparado para realizar todo el proceso contra una tecnología de base de datos no proporciona la escalabilidad para poder realizar cambios o mejoras
Por este motivo es necesario poder realizar consultas a servicios en la nube que nos permita devolver contenido e incorporar a nuestra aplicación. Y actualmente el protocolo más legible, rápido y fácil de incorporar es el uso de JSON
Conexión al servicio
El primer e importante paso es conectarnos al servicio web o API que nos proporcione los datos necesarios, es decir el JSON para comenzar a tratar los datos.
Para ello utilizaremos los datos que nos proporciona el ayuntamiento de Valencia en el Portal de datos abiertos, y en concreto utilizaremos los datos referentes a las cámaras de tráfico y seguridad de Valencia.
Y ¿cómo hacemos esto? Pues tan sencillo o complicado como utilizando la clase AsynTask y HttpURLConnection de Android. El código en concreto sería el siguiente acompañado por supuesto de la explicación en vídeo:
// Setup the connection with the DB //Esta clase realizará la conexión devolviendo el JSON @Override protected JsonReader doInBackground(String... args) { String temp = ""; try { URL url = new URL(urlCamaras); urlConnection = (HttpURLConnection) url.openConnection(); temp = urlConnection.getResponseMessage(); InputStream in = new BufferedInputStream(urlConnection.getInputStream()); reader = new JsonReader(new InputStreamReader(in, "UTF-8")); CameraJSONReader cJSONReader=new CameraJSONReader(); try { camaras = cJSONReader.readJSONMsg(reader); } catch (IOException e) { e.printStackTrace(); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (urlConnection != null) urlConnection.disconnect(); return reader; } }
Parseando el JSON
El segundo paso es parsear los datos de acuerdo a nuestras necesidades y la estructura del JSON, para este procedimiento no existe un único método ni mecanismo de realizar el proceso ya que el objetivo, la aplicación y el documento JSON serán diferentes
En nuestro caso planteamos un ejemplo haciendo uso de la clase JSONReader, que permite avanzar y parsear el Buffer recogido de la conexión
Un trozo de ejemplo sería el siguiente, aunque para entender correctamente su funcionamiento es mejor visualizar el vídeo:
// Setup the connection with the DB reader.beginObject(); while (reader.hasNext()) { String name = reader.nextName(); Log.i("MENSAJE","LLEGO A JSON"); if (name.equals("features")) { //Estamos en el array de camaras Log.i("MENSAJE","ENTRO EN FEATURES"); reader.beginArray(); while (reader.hasNext()) { camaras.add(readCamara(reader)); Log.i("MENSAJE","CAMARA AÑADIDA"); } reader.endArray(); }else { reader.skipValue(); } }