Copia de la partitura original de Haendel
Foto cortesía de Adrian Pallant con permiso bajo licencia CC BY-SA 2.0
La U de CRUD
En este post anterior, escribí sobre cómo empezar con las operaciones CRUD básicas en Couchbase Lite en Android. En esta nota rápida, quiero profundizar un poco más en la actualización de documentos. Esto abrirá la puerta a todo un nuevo conjunto de cuestiones. Vamos a echar un vistazo dentro.
Couchbase Lite es una base de datos orientada a documentos. Los documentos se almacenan como JSON objetos. Como se describe en el post anterior, es fácil trabajar directamente con el contenido del documento. Se almacenan en el objeto documento como un mapa. Eso encaja muy bien con las formas nativas de manipular los contenidos.
Modificar el enfoque directo
Cuando recuperas un documento, obtienes una copia que contiene una versión inmutable de los datos. Puedes hacer frente a esto copiando el mapa en un objeto map separado, y luego sobrescribiendo el mapa antiguo. Esto se muestra en este fragmento de código:
1 2 3 4 5 6 7 8 9 |
perfil = nuevo HashMap(); perfil.putAll(documento.getProperties()); perfil.poner("tipo", "perfil"); // Añadir un "tipo" al documento pruebe { documento.putProperties(perfil); } captura (CouchbaseLiteException ex) { Registro.e(TAG, "Operación CBL fallida"); } |
Esto en realidad crea un nuevo revisión del documento, utilizando el nuevo cuerpo del documento.
También puede utilizar crearRevisión()
para obtener un nuevo UnsavedRevision
. Esto devuelve una copia de la última revisión, pero con contenidos mutables. Puede entonces manipular el mapa de propiedades directamente. Los cambios se confirman llamando a guardar()
. Este fragmento de código tiene el mismo efecto final que el anterior:
1 2 3 4 5 6 7 8 9 |
UnsavedRevision actualización = documento.crearRevisión(); perfil = actualización.getProperties(); perfil.poner("tipo", "perfil"); // Añadir un "tipo" al documento pruebe { actualización.guardar(); } captura (CouchbaseLiteException ex) { Registro.e(TAG, "Operación CBL fallida"); } |
¿Revisiones, dice?
Eso es estupendo para muchas aplicaciones. Aún no he hablado mucho de las revisiones. Tienes la idea de que un documento está cambiando. Couchbase Lite tiene una noción de revisiones de documentos para ir junto con esos cambios.
Sin embargo, las revisiones van más allá del mero seguimiento de un conjunto lineal de cambios. Lo que no salta a la vista en ejemplos como los que he mostrado es la posibilidad de conflictos. Los conflictos ocurren cuando más de una actualización de una revisión específica de un documento es enviada a la base de datos.
Piénsalo como si fuera un documento del mundo real. Tal vez escribas un artículo (o una entrada de blog) y lo envíes a varias personas para que lo comenten. Recibes una serie de comentarios y haces algunos cambios. Luego recibes otra serie de comentarios, basados en el mismo documento original. Si lo haces con la frecuencia suficiente, es casi seguro que algunos cambios se solapen. (Bueno, para los desarrolladores de software, probablemente el mejor ejemplo sea el de los conflictos de fusión al utilizar el control de código fuente). ¡Conflicto!
Actualizador de documentos
Tratar con conflictos de documentos, historial de revisiones, y demás, es más de lo que quiero tratar en este post. Pero podemos echar un vistazo a cómo ayuda Couchbase. Esta última aproximación a la actualización puede parecer exagerada, pero llegarás a apreciarla una vez que la resolución de conflictos entre en juego. Aquí está el código:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
documento = base de datos.getDocument(documentId); pruebe { documento.actualización(nuevo Documento.Actualizador de documentos() { @Anular público booleano actualización(UnsavedRevision nuevaRevisión) { Mapa propiedades = nuevaRevisión.getUserProperties(); propiedades.poner("tipo", "perfil"); nuevaRevisión.setUserProperties(propiedades); devolver verdadero; } }); } captura (CouchbaseLiteException ex) { Registro.e(TAG, "Operación CBL fallida"); } |
Vaya, esto parece mucho más complejo que los ejemplos anteriores. En realidad sólo es un poco más complicado. Esa estructura añadida acaba facilitando mucho las cosas. ¿Qué está pasando?
Esta construcción permite a Couchbase Lite encargarse del trabajo sucio de manejar conflictos. Se define un callback basado en el método Actualizador de documentos
interfaz. Couchbase Lite se encargará de crear un nuevo UnsavedRevision
como en el ejemplo anterior. Tu método entonces necesita hacer los cambios que quieras. Al volver, Couchbase Lite automáticamente intenta guardar el documento. Si detecta un conflicto Couchbase Lite simplemente llama a actualizar()
de nuevo. Volver verdadero
si ha realizado cambios que desea guardar, o falso
de lo contrario.
Si quieres saber más sobre revisiones, colisiones y resolución de conflictos, echa un vistazo a nuestra guía aquí
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
... [Trackback]
[...] Leer más: http://www.couchbase.com/better-updates-couchbase-lite/ […]
[...] Así que, en pocas palabras, tenemos un ejemplo tanto de creación como de actualización de documentos. Esta no es la forma preferida de actualizar, aunque es suficiente en muchos casos. Puede leer más sobre actualizaciones aquí. [...]