En los últimos días hemos estado explorando cómo crear una aplicación sencilla para Android e iOS usando NativeScript, Angular y Couchbase. Primero vimos cómo utilizar Couchbase para operaciones básicas clave-valor y entonces vimos cómo consultar Couchbase como base de datos de documentos. El capítulo final es añadir soporte de replicación a nuestra aplicación NativeScript usando Couchbase Sync Gateway.

Vamos a ampliar los dos ejemplos anteriores para sincronizar datos entre plataformas y dispositivos usando Couchbase Sync Gateway, NativeScript y Angular. Tomemos como ejemplo la siguiente imagen animada:

Couchbase Sync with NativeScript and Angular

Cuando se añade un nuevo perfil al dispositivo iOS, éste se sincroniza con el dispositivo Android y viceversa. Esto es posible a través de muy poco código.

Requisitos

Los requisitos entre este ejemplo y los dos anteriores han cambiado un poco. Para tener éxito necesitarás lo siguiente:

NativeScript, Angular, y el plugin Couchbase Lite se pueden obtener a través de la CLI de NativeScript. No vamos a sincronizar nuestros datos con Couchbase Server en este ejemplo, pero podemos hacerlo fácilmente con muy pocos cambios.

Continuar donde lo dejamos

Para tener éxito con este tutorial necesitarás haber visto parte 2 que tiene su propia dependencia de haber visto parte 1. La mayor parte del código de esas guías anteriores puede copiarse y pegarse en un proyecto.

Antes de continuar, deberías tener una aplicación NativeScript funcional de dos páginas con un diálogo modal. Los datos de esta aplicación se guardan en Couchbase y consultados mediante vistas MapReduce.

Creación de un servicio Angular para Couchbase

Debido a que la replicación de datos estará involucrada, necesitamos asegurarnos de que sólo tenemos una única instancia de Couchbase ejecutándose en nuestra aplicación. En el ejemplo anterior creamos una nueva instancia por página. No podemos hacer eso con la replicación porque podríamos terminar replicando múltiples veces, lo cual es ineficiente.

Para crear una instancia singleton de Couchbase, debemos crear un servicio Angular. Crea un archivo dentro de tu proyecto en app/couchbase.service.ts e incluye el siguiente código TypeScript:

Este servicio será inyectable en cada página. Una única instancia de Couchbase se almacenará en el directorio base de datos y la información sobre los replicadores push y pull se almacenará en sus respectivas variables.

Dentro del constructor tenemos lo siguiente:

Antes de crear una nueva instancia de Couchbase nos aseguramos de que no tenemos ya una. Si no es así, abrimos la base de datos y creamos una vista MapReduce, que no es nada que no hayamos visto ya en los ejemplos anteriores.

A la hora de obtener esta instancia podemos devolverla a través de la función getDatabase función. Esto nos lleva a la replicación de datos.

Para este ejemplo haremos una sincronización bidireccional contra una instancia de Sync Gateway. Tenemos la opción de sincronizar una sola vez o de forma continua mientras la aplicación esté abierta. Cuando deseemos detener la replicación podemos hacer uso de la opción stopSync que se ve a continuación:

Dado que se trata de un servicio compartido, debe inyectarse en el directorio del proyecto @NgModule bloque. Abra el archivo app/app.module.ts e incluir el siguiente TypeScript:

Lo anterior es lo que habíamos visto anteriormente, pero esta vez importamos el CouchbaseService y lo inyectó en el proveedores de la @NgModule bloque.

Ahora cada una de nuestras páginas puede ser actualizada para utilizar el nuevo servicio Angular.

Actualización de las páginas de la aplicación NativeScript

Tenemos dos páginas que necesitan ser actualizadas para reflejar nuestro servicio Angular. Abra el archivo app/components/profile-list/profile-list.ts y eliminar el código de Couchbase que se encuentra en el archivo constructor método. En su lugar o archivo debe tener el siguiente aspecto:

Observa que hemos importado CouchbaseService y lo inyectó en el constructor junto con NgZone. En lugar de obtener la base de datos y crear una vista, sólo tenemos que llamar a la función getDatabase función de nuestro servicio.

No está tan mal hasta ahora, ¿verdad?

Ahora vamos a abrir el proyecto app/components/profile/profile.ts archivo. En este archivo, incluya el siguiente código:

A excepción de NgZone, hemos hecho el mismo cambio en Couchbase que en la página anterior. Veremos qué NgZone es muy pronto.

En este punto podemos proceder a configurar Sync Gateway para preparar la sincronización de datos.

Creación de la configuración de replicación de Sync Gateway

Ya deberías haber descargado Pasarela de sincronización Couchbase por ahora. Con él instalado necesitamos crear un archivo de configuración para nuestro proyecto. El siguiente es un ejemplo de una configuración muy simple:

La configuración anterior puede guardarse en un archivo llamado sync-gateway-config.json o similar. Esencialmente utiliza un almacenamiento en memoria llamado morsa: con un nombre de base de datos ejemplo. En nuestro ejemplo no hay permisos de lectura ni escritura. Todos los datos se sincronizarán en todas las plataformas y dispositivos.

Conectar el Sync Gateway a Couchbase Server es tan sencillo como cambiar morsa: al host de su instancia de Couchbase Server.

Para ejecutar Sync Gateway desde la línea de comandos debe ejecutar:

Se creará un panel de control al que se podrá acceder desde http://localhost:4985/_admin/. A nivel de aplicación, utilizará el puerto 4984.

Incluyendo lógica de sincronización para Couchbase y NativeScript

Todo está completo para preparar la replicación de datos en nuestra aplicación. La replicación de datos nos permitirá utilizar escuchadores de cambios para actualizar nuestra interfaz de usuario según sea necesario.

Abra el archivo app/components/profile-list/profile-list.ts e incluya lo siguiente dentro del ngOnInit método:

Cuando el ngOnInit iniciamos la sincronización con nuestro Sync Gateway local. Siéntase libre de establecer el nombre de host a lo que sea apropiado para usted. Después de iniciar la sincronización, configuramos nuestro oyente de cambios para empujar los cambios en nuestro perfiles array. Como se trata de un oyente, necesitamos utilizar NgZone de lo contrario no se reflejará en la interfaz de usuario.

Lo anterior es sólo un ejemplo sencillo en el que añadimos todos los cambios. En realidad, tendrá que comprobar si los datos han cambiado, se han creado o se han eliminado. Todos los escenarios vendrían a través de la addDatabaseChangeListener.

Cuando la aplicación se detiene, queremos detener la sincronización. En el ngOnDestroy método, incluya lo siguiente:

La replicación a Couchbase Sync Gateway se detendrá cuando se llame al método Angular anterior.

Conclusión

En este tutorial has visto cómo añadir soporte de sincronización a tu aplicación móvil Angular NativeScript. Esta fue la tercera parte de tres en la serie de tutoriales. Anteriormente vimos cómo hacer operaciones básicas de Couchbase para guardar y cargar datos así como búsqueda de documentos. Data en el desarrollo de aplicaciones móviles utilizando frameworks como NativeScript y Angular debería ser fácil. Poder almacenar objetos JavaScript y datos JSON en una base de datos NoSQL y hacer que se sincronicen es un gran alivio para el desarrollador.

Autor

Publicado por Nic Raboy, Defensor del Desarrollador, Couchbase

Nic Raboy es un defensor de las tecnologías modernas de desarrollo web y móvil. Tiene experiencia en Java, JavaScript, Golang y una variedad de frameworks como Angular, NativeScript y Apache Cordova. Nic escribe sobre sus experiencias de desarrollo relacionadas con hacer el desarrollo web y móvil más fácil de entender.

4 Comentarios

  1. Gracias por esta serie de tutoriales, es realmente genial. Yo era capaz de conseguir que funcione entre un androide y el dispositivo iOS y es bastante fluido. Para este ejemplo, yo estaba usando esencialmente la puerta de enlace de sincronización en mi mac como un intermediario que los otros dispositivos de la red se sincronizan con.

    Me gustaría utilizar esta capacidad de sincronización para una aplicación móvil que tendrá varios dispositivos en la misma red y me gustaría que funcionara en modo sin conexión, por lo que tendrá que haber una función separada para muchas redes diferentes. ¿Hay alguna forma de configurar una pasarela de sincronización sólo entre dispositivos móviles de una red sin tener que configurarla en un ordenador de la red? ¿O tendré que hacer que cada red instale y configure su propio Sync Gateway con los archivos de configuración de sync-gateway que yo proporcione?

    1. Existe soporte P2P en las APIs subyacentes de Android e iOS, pero nunca fue añadido al plugin NativeScript.

      Couchbase Lite 2.0 llegará pronto, así que las cosas cambiarán. Si puedes, yo leería al respecto y aguantaría un poco.

  2. Gracias por la rápida respuesta, Nic. Sabes si alguna de estas nuevas cosas P2P finalmente llegarán al plugin NativeScript?

  3. Hola Nic, tengo una pregunta, estoy tratando de almacenar un documento utilizando couchbase lite con nativescript, en un proyecto que estoy construyendo pero de alguna manera mi lógica no está funcionando. Me preguntaba si podrías echarle un vistazo a mi código y decirme si estoy haciendo algo mal. Este es un enlace a mi código: https://i.gyazo.com/99914e2c1c54b37ea7486ff050bc6dd0.pngGracias de antemano.

Dejar una respuesta