Servidor Couchbase

Persistir y abstraer datos en una aplicación Typescript de Nativescript

Aaron Ullal es un Desarrollador freelance en FactoryMind, amante de la gente y de la vida, vive en beta permanente. Él es un desarrollador full stack con sede en la hermosa ciudad de Trento, Italia.

IT apasionada por más que 7 años, es actualmente centrado en el desarrollo móvil con NativeScript y el diseño de soluciones arquitectónicas para plataformas complejas.

Aaron Ullal

Couchbase es una gran herramienta para persistir datos dentro de nuestra app. Si no has oído hablar de él, es un almacenamiento de objetos de documentos que te permite guardar tus datos.

Si estás usando NativeScript-Angular, ya hay algunos tutoriales geniales sobre cómo empezar y algunas características más avanzadas. En este artículo nos centraremos en NativeScript con TypeScript.

Qué trataremos

En este sencillo artículo vamos a ver cómo guardar y recuperar alguna información del usuario por:

  1. Instalación de Couchbase
  2. Creación de una clase TypeScript que proporciona una capa de abstracción sobre Couchbase, haciéndolo mucho más fácil de usar (sin instrucciones complejas para la inserción y recuperación de datos).
  3. Implementación del patrón singleton en la clase

Al final del tutorial seremos capaces de utilizar instrucciones como

¡sin tener que escribir extensas consultas para leer y escribir!

Además, todo el código de este artículo está disponible en este repositorio de GitHub. Siéntete libre de clonarlo y probarlo.

Sin más dilación, ¡empecemos!

Instalar el plugin Couchbase

Vamos a crear una nueva aplicación NativeScript utilizando la plantilla TypeScript.

En la carpeta raíz de nuestro recién creado proyecto NativeScript, vamos a dar el siguiente comando para añadir el plugin y guardarlo en nuestra lista de dependencias:

Una vez que el plugin se ha instalado correctamente, vamos a crear una clase que vamos a utilizar para almacenar y recuperar la información de usuario que necesitamos.

Clase de capa de abstracción

OPCIONAL: Suele ser una buena idea crear una interfaz para definir las propiedades que necesitamos incluir.

Navega a la carpeta app de nuestro proyecto y crea una carpeta models. Aquí definiremos nuestro archivo Models.ts (app/models/Models.ts):

Una vez definida nuestra interfaz, vamos a crear la clase que la implementa. Llamaremos a la clase UserSettings.

Dentro de esta clase también necesitamos almacenar la información relacionada con nuestra base de datos Couchbase.

Vamos a desglosarlo:

En las dos primeras líneas requerimos el plugin de Couchbase que instalamos previamente junto con el módulo Models que utilizaremos para aprovechar el tipado fuerte de TypeScript.

A continuación, definimos algunas otras propiedades privadas que utilizaremos más adelante:

NOMBRE_BASE_DE_DATOS: Es el nombre de la base de datos. Asegúrate de que no contenga mayúsculas (y que tenga menos de 240 caracteres).

USER_SETTINGS_DOC_ID: Nombre del documento Couchbase.

base de datos: Es la instancia del conector de base de datos.

_userSettingsDocument: Couchbase es una base de datos No orientada a documentos. No tiene tablas, en su lugar utiliza una entidad de almacenamiento primaria conocida como Documento. Básicamente un documento es una colección de pares clave-valor, donde el valor puede ser prácticamente cualquier cosa (cadena, números, matrices, etc.). Esto es lo que hace de Couchbase la solución número uno si necesitas almacenar una variedad de datos no relacionales: simplicidad y flexibilidad.

_userSettingsObj: Es el objeto JavaScript que utilizaremos para sincronizar la información con el documento de Couchbase.

Veremos por qué declaramos la variable _instance más adelante, cuando implementemos el patrón singleton.

Ahora que tenemos esto cubierto, veamos cómo funciona el constructor de nuestra clase:

 

Una vez más, vamos a ver en detalle lo que está pasando en nuestro constructor:.

this._database = new CouchBaseModule.Couchbase(this.DATABASE_NAME);

Aquí estamos instanciando Couchbase y diciendo a qué base de datos queremos conectarnos.

this._userSettingsDocument = this._database.getDocument(this.USER_SETTINGS_DOC_ID);

Esta línea le dice a Couchbase que nos consiga nuestro documento (la colección que usamos para almacenar nuestra información).

 

 

Si nuestro documento aún no existe (por ejemplo, la primera vez), creamos un objeto vacío de tipo UserSettings y también creamos un nuevo documento. El segundo parámetro que asignamos a la función createDocument es el id del documento. Si no proporcionamos este parámetro Couchbase asignará al documento un UUID automáticamente.

¡Fantástico! Ahora que nuestro constructor está hecho, veamos cómo podemos establecer y recuperar información sobre nuestro usuario.

Vamos a configurar algunos getters y setters para lograr precisamente eso.

 

Como de costumbre, desglosemos el código.

En el getter hacemos tres cosas:

1) Leemos los datos de nuestro documento en nuestro objeto

2) Obtener el valor deseado (en este caso el nombre de usuario)

3) Devuélvalo

Muy fácil :)

En el setter hacemos lo siguiente:

1) Obtenemos la última versión de nuestro userSettingsObject leyéndolo de la db

2) Establecemos la propiedad username al valor pasado a la función

3) Actualizamos nuestro documento en la base de datos. A diferencia de la función createDocument, el primer parámetro es el ID del documento y el segundo es el propio objeto.

Pero ... ¿por qué necesitamos primero getDocument? ¿Por qué no podemos simplemente actualizar el documento con el objeto?

Me alegro de que preguntes.

Básicamente, cada vez que actualizamos un documento, Couchbase hace un seguimiento del cambio. Cada documento tiene una propiedad _rev; este valor es actualizado por Couchbase cada vez que se realiza una operación de escritura sobre el documento. Si intentamos actualizar un documento con un _rev más antiguo, Couchbase lo rechazará.

Patrón Singleton

¿A quién no le gustan los patrones de diseño? Hoy vamos a implementar uno muy simple, pero efectivo: el singleton. El patrón singleton, cuando se implementa correctamente, "restringe la instanciación de un clase a uno objeto. Esto es útil cuando se necesita exactamente un objeto para coordinar las acciones en todo el sistema", que es exactamente nuestro caso.

Básicamente nos aseguramos de que sólo tenemos una instancia de nuestra clase leyendo y escribiendo en nuestra base de datos.

¿Cómo lo hacemos? Una forma sencilla de conseguirlo es con los dos pasos siguientes:

1) Hacer nuestro constructor privado (Introducido en ts 2.0)

2) Implementar un método getInstance que devuelva la instancia actual si existe, o una nueva si es la primera llamada.

PASO 1:

PASO 2:

Ahora podemos seguir adelante y crear nuestro método getInstance() que se verá algo como esto:

Estupendo. Hemos abstraído datos e implementado el patrón singleton, sigamos adelante y veamos cómo podemos utilizar nuestra nueva y brillante clase UserSettings.

Vamos a editar los archivos existentes main-page.xml y main-page.ts.

En primer lugar, definiremos el diseño básico de la interfaz de usuario. Para esta demo usaremos un campo de texto para obtener la entrada del usuario, un botón para guardar el valor en la base de datos, y una etiqueta para mostrar el valor actual en la base de datos. Como puedes ver, si no hay datos almacenados en la base de datos la etiqueta simplemente mostrará "No hay datos almacenados en la base de datos".

Este es el aspecto que debería tener nuestro archivo main-page.xml:

De acuerdo. Ahora que tenemos un diseño básico podemos proceder a añadir algo de lógica a la interfaz de usuario.

Este es el aspecto que debería tener nuestro archivo main-page.ts:

¿Qué hemos hecho? En las primeras líneas acabamos de importar un montón de cosas, comprobando los comentarios para ver lo que hacen los módulos. A continuación tenemos:

Así es como obtenemos una instancia de nuestra clase UserSettings.

Continuando, declaramos otra clase pequeña:

Como puedes ver MainPageViewModel extiende la clase Observable. Si no estás familiarizado con los Observables, debes saber que son básicamente objetos JavaScript que activan una notificación si una de sus propiedades cambia. Puedes encontrar más información en aquí.

Nuestro modelo de vista tiene dos propiedades: username (que vinculamos a nuestro campo de texto) y dbusername (que vinculamos a nuestra etiqueta). Cada vez que creamos una nueva instancia de nuestra clase asignamos a dbusername cualquier valor presente en nuestra instancia userSettings, que a su vez va y lee datos en nuestra base de datos (¿recuerdas nuestro método get username() getter?).

Esta función es llamada cada vez que navegamos a nuestra página. Instanciamos nuestra clase MainPageViewModel y la asignamos a la variable mainPageViewModel y la enlazamos a nuestra página. Simple y llanamente.

Por último, pero no menos importante, definimos el comportamiento para el clic del botón:

Una vez más, muy simple: Escribimos en la base de datos el valor de nuestro campo de texto (mainPageViewModel.username está vinculado al campo de texto) y luego actualizamos el valor de dbusername para actualizar la etiqueta. Una imagen vale más que mil palabras, ¡así que aquí va un GIF!

Este post forma parte del Programa de Escritura de la Comunidad Couchbase

Comparte este artículo
Recibe actualizaciones del blog de Couchbase en tu bandeja de entrada
Este campo es obligatorio.

Autor

Publicado por Laura Czajkowski, Directora de la Comunidad de Desarrolladores, Couchbase

Laura Czajkowski es la Snr. Developer Community Manager en Couchbase supervisando la comunidad. Es responsable de nuestro boletín mensual para desarrolladores.

1 Comentarios

  1. Gracias Laura por este blog tan detallado.
    ¿Podemos tener un blog similar para Nativescript-vue couchbase sobre cómo persistir los datos?

Deja un comentario

¿Listo para empezar con Couchbase Capella?

Empezar a construir

Consulte nuestro portal para desarrolladores para explorar NoSQL, buscar recursos y empezar con tutoriales.

Utilizar Capella gratis

Ponte manos a la obra con Couchbase en unos pocos clics. Capella DBaaS es la forma más fácil y rápida de empezar.

Póngase en contacto

¿Quieres saber más sobre las ofertas de Couchbase? Permítanos ayudarle.