Foto del mapa más antiguo conocido
Foto cortesía de cea + con permiso bajo licencia CC BY 2.0
En este post me gustaría seguir explorando elementos fundamentales de Couchbase Móvil en Android. Gran parte de la información se aplicará también a iOS. En breve publicaremos más información sobre iOS y las herramientas multiplataforma.
Puede leer una descripción general de nivel medio de por qué soy un converso a NoSQL y el uso de Couchbase Lite en lugar de SQLite y otras opciones de almacenamiento para móviles. aquí.
Este puesto te pondrá en marcha en Android en un par de minutos. Y éste explora las operaciones básicas con bases de datos. Verás que en ese post utilizo Mapas
ampliamente.
Trabajar directamente con JSON
Puedes hacer muchas cosas con los mapas. A menudo también extraerás datos en otras estructuras como listas. Eso puede ser todo lo que necesites. Aquí tienes un ejemplo del tipo de typecast necesario.
1 |
Lista comentarios = (ArrayList)documento.getProperty(CLAVE_COMENTARIOS); |
En la aplicación de ejemplo, almacené un conjunto de comentarios como un array de cadenas. Usted todavía tiene que tirar de la matriz sobre la base de una clave, pero a partir de ahí se puede manejar como una lista.
Un toque más de sofisticación
Para aplicaciones más sofisticadas, es posible que desee convertir sus documentos completamente en objetos.
Existen varias librerías para convertir JSON a/desde objetos Java. Las API estándar de Android para el manejo de JSON tienen algunas limitaciones reales, pero está integrado, así que eso es una ventaja. Google tiene una biblioteca, Gson. Gson puede manejar casos en los que no se tiene acceso a la fuente. Me pareció interesante leer la Documento de diseño Gson para profundizar en otras consideraciones al manejar JSON.
En este post voy a hablar de otra popular librería JSON, Jackson. Jackson es bastante maduro, soporta tres enfoques diferentes para el manejo de JSON, y tiene una sólida reputación de eficiencia.
Vinculación de bases de datos
Lee los detalles sobre las tres modalidades para Jackson aquí si quieres. La mayoría de los desarrolladores de aplicaciones probablemente querrán utilizar la función databinding enfoque. Esto suena quizás un poco intimidante, pero en realidad no lo es. Databinding aquí sólo se refiere a hacer coincidir el JSON con las propiedades de un objeto de alguna manera automatizada.
Por ejemplo, databinding significa tomar esto
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
{ "id": "contacto100", "tipo": "contacto", "nombre": "John", "apellido": "Smith", "email": "john.smith@couchbase.com", "direcciones": [ { "línea_dirección": "123 Main Street", "ciudad": "Mountain View", "país": "US" }, { "línea_dirección": "Mercado 123", "ciudad": "San Francisco", "país": "US" } ] } |
y utilizarlo para crear una instancia de este
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
público clase Póngase en contacto con { público Cadena id; público Cadena tipo; público Cadena nombre; público Cadena apellido; público Cadena correo electrónico; público Dirección[] direcciones; público estático clase Dirección { público Cadena línea_de_dirección; público Cadena ciudad; público Cadena país; } } |
Jackson es bastante bueno en averiguar cómo hacer esto sin ayuda. Dado que todos los campos anteriores se declaran públicos, no hay nada más que hacer. Asumiendo que los datos JSON están en un archivo Mapa
llamado "map", este fragmento rellenará el a Póngase en contacto con
instancia.
1 |
Póngase en contacto con póngase en contacto con = mapeador.convertValue(mapa, Póngase en contacto con.clase); |
Si el JSON anterior representa los datos en un documento Couchbase, el código sería algo como esto.
1 |
Póngase en contacto con póngase en contacto con = mapeador.convertValue(documento.getProperties(), Póngase en contacto con.clase); |
Esto funciona si los campos no son públicos si hay getters y setters correspondientes.
Un poco de ayuda: Anotaciones
Por último, puede obtener un control realmente preciso de la construcción de sus objetos utilizando Anotaciones. Las anotaciones de Jackson son muy potentes. Una descripción completa está más allá del alcance de este blog. Puedes leer una buena guía que las describe aquí.
POJO (Plain Old Java Objects)1
Para ayudar en el uso de Anotaciones, me pareció útil comenzar con una clase base. Aquí está el código.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
@JsonInclude(Incluya.NON_NULL) público clase POJO { @JsonIgnore privado Mapa<Cadena, Objeto> propiedadesadicionales = nuevo HashMap<>(); @JsonAnyGetter público Mapa<Cadena, Objeto> getAdditionalProperties() { devolver este.propiedadesadicionales; } @JsonAnySetter público void setAdditionalProperty(Cadena nombre, Objeto valor) { este.propiedadesadicionales.poner(nombre, valor); } } |
La primera anotación @JsonInclude(Include.NON_NULL)
indica a Jackson que ignore los campos nulos (es decir, lo que falta en los datos).
Las siguientes tres anotaciones, junto con el código, permiten a Jackson manejar cualquier campo no especificado. Jackson rellenará felizmente cualquier cosa que no le hayas dicho en el mapa additionalProperties. Esto significa que puedes cambiar tus datos sin preocuparte de que tu código explote. No hace falta decir que esto podría permitir que errores reales pasen desapercibidos, ¡así que úsalo con precaución!
Por último, en caso de que quieras evitar hacerlo tú mismo, aquí tienes un enlace a una herramienta que puede ayudarte a automatizar la anotación de clases: http://www.jsonschema2pojo.org/
Nota final
Couchbase Lite utiliza actualmente Jackson internamente. Mucha gente recomendaría no confiando en esto. Lo señalo por si te encuentras con conflictos de librerías u otros problemas.
Posdata
Consulte más recursos en nuestra portal para desarrolladores y síganos en Twitter @CouchbaseDev. Puede enviar preguntas a nuestro foros. Y participamos activamente en Stack Overflow.
Puede seguirme personalmente en @HodGreeley