{"id":2490,"date":"2017-01-11T15:00:00","date_gmt":"2017-01-11T15:00:00","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2490"},"modified":"2025-06-13T20:15:27","modified_gmt":"2025-06-14T03:15:27","slug":"syncing-couchbase-documents-between-mobile-platforms-and-devices-with-nativescript-and-angular","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/syncing-couchbase-documents-between-mobile-platforms-and-devices-with-nativescript-and-angular\/","title":{"rendered":"Sincronizaci\u00f3n de documentos Couchbase entre plataformas y dispositivos m\u00f3viles con NativeScript y Angular"},"content":{"rendered":"<p>En los \u00faltimos d\u00edas hemos estado explorando c\u00f3mo crear una aplicaci\u00f3n sencilla para Android e iOS usando NativeScript, Angular y Couchbase. Primero vimos c\u00f3mo <a href=\"https:\/\/www.couchbase.com\/blog\/es\/key-value-operations-in-couchbase-mobile-via-nativescript-and-angular\/\">utilizar Couchbase para operaciones b\u00e1sicas clave-valor<\/a> y entonces vimos <a href=\"https:\/\/www.couchbase.com\/blog\/es\/querying-for-couchbase-documents-in-a-nativescript-angular-mobile-application\/\">c\u00f3mo consultar Couchbase como base de datos de documentos<\/a>. El cap\u00edtulo final es a\u00f1adir soporte de replicaci\u00f3n a nuestra aplicaci\u00f3n NativeScript usando Couchbase Sync Gateway.<\/p>\n<p>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:<\/p>\n<div class=\"figure\"><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2017\/january\/syncing-couchbase-documents-between-mobile-platforms-and-devices-with-nativescript-and-angular\/ns-cb-profile-sync.gif\" alt=\"Couchbase Sync with NativeScript and Angular\" \/><\/div>\n<p>Cuando se a\u00f1ade un nuevo perfil al dispositivo iOS, \u00e9ste se sincroniza con el dispositivo Android y viceversa. Esto es posible a trav\u00e9s de muy poco c\u00f3digo.<\/p>\n<h2 id=\"the-requirements\">Requisitos<\/h2>\n<p>Los requisitos entre este ejemplo y los dos anteriores han cambiado un poco. Para tener \u00e9xito necesitar\u00e1s lo siguiente:<\/p>\n<ul>\n<li><a href=\"https:\/\/www.nativescript.org\">NativeScript<\/a> 2.0+<\/li>\n<li>Pasarela de sincronizaci\u00f3n Couchbase<\/li>\n<\/ul>\n<p>NativeScript, Angular, y el plugin Couchbase Lite se pueden obtener a trav\u00e9s de la CLI de NativeScript. No vamos a sincronizar nuestros datos con Couchbase Server en este ejemplo, pero podemos hacerlo f\u00e1cilmente con muy pocos cambios.<\/p>\n<h2 id=\"picking-up-where-we-left-off\">Continuar donde lo dejamos<\/h2>\n<p>Para tener \u00e9xito con este tutorial necesitar\u00e1s haber visto <a href=\"https:\/\/www.couchbase.com\/blog\/es\/querying-for-couchbase-documents-in-a-nativescript-angular-mobile-application\/\">parte 2<\/a> que tiene su propia dependencia de haber visto <a href=\"https:\/\/www.couchbase.com\/blog\/es\/key-value-operations-in-couchbase-mobile-via-nativescript-and-angular\/\">parte 1<\/a>. La mayor parte del c\u00f3digo de esas gu\u00edas anteriores puede copiarse y pegarse en un proyecto.<\/p>\n<p>Antes de continuar, deber\u00edas tener una aplicaci\u00f3n NativeScript funcional de dos p\u00e1ginas con un di\u00e1logo modal. Los datos de esta aplicaci\u00f3n se guardan en <a href=\"https:\/\/www.couchbase.com\/blog\/es\/\">Couchbase<\/a> y consultados mediante vistas MapReduce.<\/p>\n<h2 id=\"creating-an-angular-service-for-couchbase\">Creaci\u00f3n de un servicio Angular para Couchbase<\/h2>\n<p>Debido a que la replicaci\u00f3n de datos estar\u00e1 involucrada, necesitamos asegurarnos de que s\u00f3lo tenemos una \u00fanica instancia de Couchbase ejecut\u00e1ndose en nuestra aplicaci\u00f3n. En el ejemplo anterior creamos una nueva instancia por p\u00e1gina. No podemos hacer eso con la replicaci\u00f3n porque podr\u00edamos terminar replicando m\u00faltiples veces, lo cual es ineficiente.<\/p>\n<p>Para crear una instancia singleton de Couchbase, debemos crear un servicio Angular. Crea un archivo dentro de tu proyecto en <strong>app\/couchbase.service.ts<\/strong> e incluye el siguiente c\u00f3digo TypeScript:<\/p>\n<pre><code>import { Injectable } from \"@angular\/core\";\r\nimport { Couchbase } from \"nativescript-couchbase\";\r\n\r\n@Injectable()\r\nexport class CouchbaseService {\r\n\r\n    private database: any;\r\n    private pull: any;\r\n    private push: any;\r\n\r\n    public constructor() { }\r\n\r\n    public getDatabase() { }\r\n\r\n    public startSync(gateway: string, continuous: boolean) { }\r\n\r\n    public stopSync() { }\r\n\r\n}<\/code><\/pre>\n<p>Este servicio ser\u00e1 inyectable en cada p\u00e1gina. Una \u00fanica instancia de Couchbase se almacenar\u00e1 en el directorio <code>base de datos<\/code> y la informaci\u00f3n sobre los replicadores push y pull se almacenar\u00e1 en sus respectivas variables.<\/p>\n<p>Dentro del <code>constructor<\/code> tenemos lo siguiente:<\/p>\n<pre><code>public constructor() {\r\n    if(!this.database) {\r\n        this.database = new Couchbase(\"data\");\r\n        this.database.createView(\"profiles\", \"1\", function(document, emitter) {\r\n            emitter.emit(document._id, document);\r\n        });\r\n    }\r\n}<\/code><\/pre>\n<p>Antes de crear una nueva instancia de Couchbase nos aseguramos de que no tenemos ya una. Si no es as\u00ed, abrimos la base de datos y creamos una vista MapReduce, que no es nada que no hayamos visto ya en los ejemplos anteriores.<\/p>\n<pre><code>public getDatabase() {\r\n    return this.database;\r\n}<\/code><\/pre>\n<p>A la hora de obtener esta instancia podemos devolverla a trav\u00e9s de la funci\u00f3n <code>getDatabase<\/code> funci\u00f3n. Esto nos lleva a la replicaci\u00f3n de datos.<\/p>\n<pre><code>public startSync(gateway: string, continuous: boolean) {\r\n    this.push = this.database.createPushReplication(gateway);\r\n    this.pull = this.database.createPullReplication(gateway);\r\n\r\n    this.push.setContinuous(continuous);\r\n    this.pull.setContinuous(continuous);\r\n\r\n    this.push.start();\r\n    this.pull.start();\r\n}<\/code><\/pre>\n<p>Para este ejemplo haremos una sincronizaci\u00f3n bidireccional contra una instancia de Sync Gateway. Tenemos la opci\u00f3n de sincronizar una sola vez o de forma continua mientras la aplicaci\u00f3n est\u00e9 abierta. Cuando deseemos detener la replicaci\u00f3n podemos hacer uso de la opci\u00f3n <code>stopSync<\/code> que se ve a continuaci\u00f3n:<\/p>\n<pre><code>public stopSync() {\r\n    this.push.stop();\r\n    this.pull.stop();\r\n}<\/code><\/pre>\n<p>Dado que se trata de un servicio compartido, debe inyectarse en el directorio del proyecto <code>@NgModule<\/code> bloque. Abra el archivo <strong>app\/app.module.ts<\/strong> e incluir el siguiente TypeScript:<\/p>\n<pre><code>import { NgModule, NO_ERRORS_SCHEMA } from \"@angular\/core\";\r\nimport { NativeScriptModule } from \"nativescript-angular\/platform\";\r\nimport { NativeScriptFormsModule } from \"nativescript-angular\/forms\";\r\nimport { NativeScriptRouterModule } from \"nativescript-angular\/router\";\r\nimport { ModalDialogService } from \"nativescript-angular\/modal-dialog\";\r\n\r\nimport { appComponents, appRoutes } from \".\/app.routing\";\r\nimport { AppComponent } from \".\/app.component\";\r\nimport { ModalComponent } from \".\/app.modal\";\r\nimport { CouchbaseService } from \".\/couchbase.service\";\r\n\r\n@NgModule({\r\n    declarations: [AppComponent, ModalComponent, ...appComponents],\r\n    entryComponents: [ModalComponent],\r\n    bootstrap: [AppComponent],\r\n    imports: [\r\n        NativeScriptModule,\r\n        NativeScriptFormsModule,\r\n        NativeScriptRouterModule,\r\n        NativeScriptRouterModule.forRoot(appRoutes)\r\n    ],\r\n    providers: [ModalDialogService, CouchbaseService],\r\n    schemas: [NO_ERRORS_SCHEMA]\r\n})\r\nexport class AppModule { }<\/code><\/pre>\n<p>Lo anterior es lo que hab\u00edamos visto anteriormente, pero esta vez importamos el <code>CouchbaseService<\/code> y lo inyect\u00f3 en el <code>proveedores<\/code> de la <code>@NgModule<\/code> bloque.<\/p>\n<p>Ahora cada una de nuestras p\u00e1ginas puede ser actualizada para utilizar el nuevo servicio Angular.<\/p>\n<h2 id=\"upgrading-the-nativescript-application-pages\">Actualizaci\u00f3n de las p\u00e1ginas de la aplicaci\u00f3n NativeScript<\/h2>\n<p>Tenemos dos p\u00e1ginas que necesitan ser actualizadas para reflejar nuestro servicio Angular. Abra el archivo <strong>app\/components\/profile-list\/profile-list.ts<\/strong> y eliminar el c\u00f3digo de Couchbase que se encuentra en el archivo <code>constructor<\/code> m\u00e9todo. En su lugar o archivo debe tener el siguiente aspecto:<\/p>\n<pre><code>import { Component, OnInit, OnDestroy, NgZone } from \"@angular\/core\";\r\nimport { Location } from \"@angular\/common\";\r\nimport { Router } from \"@angular\/router\";\r\nimport { CouchbaseService } from \"..\/..\/couchbase.service\";\r\n\r\n@Component({\r\n    selector: \"profile-list\",\r\n    templateUrl: \".\/components\/profile-list\/profile-list.html\",\r\n})\r\nexport class ProfileListComponent implements OnInit, OnDestroy {\r\n\r\n    public profiles: Array;\r\n    private database: any;\r\n\r\n    public constructor(private router: Router, private location: Location, private zone: NgZone, private couchbase: CouchbaseService) {\r\n        this.database = this.couchbase.getDatabase();\r\n        this.profiles = [];\r\n    }\r\n\r\n    public ngOnInit() {\r\n        this.location.subscribe(() =&gt; {\r\n            this.refresh();\r\n        });\r\n        this.refresh();\r\n    }\r\n\r\n    public refresh() {\r\n        this.profiles = [];\r\n        let rows = this.database.executeQuery(\"profiles\");\r\n        for(let i = 0; i &lt; rows.length; i++) {\r\n            this.profiles.push(rows[i]);\r\n        }\r\n    }\r\n\r\n    public create() {\r\n        this.router.navigate([\"profile\"]);\r\n    }\r\n\r\n}<\/code><\/pre>\n<p>Observa que hemos importado <code>CouchbaseService<\/code> y lo inyect\u00f3 en el <code>constructor<\/code> junto con <code>NgZone<\/code>. En lugar de obtener la base de datos y crear una vista, s\u00f3lo tenemos que llamar a la funci\u00f3n <code>getDatabase<\/code> funci\u00f3n de nuestro servicio.<\/p>\n<p>No est\u00e1 tan mal hasta ahora, \u00bfverdad?<\/p>\n<p>Ahora vamos a abrir el proyecto <strong>app\/components\/profile\/profile.ts<\/strong> archivo. En este archivo, incluya el siguiente c\u00f3digo:<\/p>\n<pre><code>import { Component, ViewContainerRef } from \"@angular\/core\";\r\nimport { Location } from \"@angular\/common\";\r\nimport { ModalDialogService } from \"nativescript-angular\/directives\/dialogs\";\r\nimport { CouchbaseService } from \"..\/..\/couchbase.service\";\r\nimport { ModalComponent } from \"..\/..\/app.modal\";\r\n\r\n@Component({\r\n    selector: \"profile\",\r\n    templateUrl: \".\/components\/profile\/profile.html\",\r\n})\r\nexport class ProfileComponent {\r\n\r\n    public profile: any;\r\n    private database: any;\r\n\r\n    public constructor(private modal: ModalDialogService, private vcRef: ViewContainerRef, private location: Location, private couchbase: CouchbaseService) {\r\n        this.profile = {\r\n            photo: \"~\/kitten1.jpg\",\r\n            firstname: \"\",\r\n            lastname: \"\"\r\n        }\r\n        this.database = this.couchbase.getDatabase();\r\n    }\r\n\r\n    public showModal(fullscreen: boolean) {\r\n        let options = {\r\n            context: { promptMsg: \"Pick your avatar!\" },\r\n            fullscreen: fullscreen,\r\n            viewContainerRef: this.vcRef\r\n        };\r\n        this.modal.showModal(ModalComponent, options).then((res: string) =&gt; {\r\n            this.profile.photo = res || \"~\/kitten1.jpg\";\r\n        });\r\n    }\r\n\r\n    public save() {\r\n        this.database.createDocument(this.profile);\r\n        this.location.back();\r\n    }\r\n\r\n}<\/code><\/pre>\n<p>A excepci\u00f3n de <code>NgZone<\/code>, hemos hecho el mismo cambio en Couchbase que en la p\u00e1gina anterior. Veremos qu\u00e9 <code>NgZone<\/code> es muy pronto.<\/p>\n<p>En este punto podemos proceder a configurar Sync Gateway para preparar la sincronizaci\u00f3n de datos.<\/p>\n<h2 id=\"building-the-sync-gateway-replication-configuration\">Creaci\u00f3n de la configuraci\u00f3n de replicaci\u00f3n de Sync Gateway<\/h2>\n<p>Ya deber\u00edas haber descargado <a href=\"https:\/\/www.couchbase.com\/blog\/es\/downloads\/\">Pasarela de sincronizaci\u00f3n Couchbase<\/a> por ahora. Con \u00e9l instalado necesitamos crear un archivo de configuraci\u00f3n para nuestro proyecto. El siguiente es un ejemplo de una configuraci\u00f3n muy simple:<\/p>\n<pre><code>{\r\n    \"log\":[\"CRUD+\", \"REST+\", \"Changes+\", \"Attach+\"],\r\n    \"databases\": {\r\n        \"example\": {\r\n            \"server\":\"walrus:\",\r\n            \"sync\":`\r\n                function (doc) {\r\n                    channel (doc.channels);\r\n                }\r\n            `,\r\n            \"users\": {\r\n                \"GUEST\": {\r\n                    \"disabled\": false,\r\n                    \"admin_channels\": [\"*\"]\r\n                }\r\n            }\r\n        }\r\n    }\r\n}<\/code><\/pre>\n<p>La configuraci\u00f3n anterior puede guardarse en un archivo llamado <strong>sync-gateway-config.json<\/strong> o similar. Esencialmente utiliza un almacenamiento en memoria llamado <code>morsa:<\/code> con un nombre de base de datos <code>ejemplo<\/code>. En nuestro ejemplo no hay permisos de lectura ni escritura. Todos los datos se sincronizar\u00e1n en todas las plataformas y dispositivos.<\/p>\n<p>Conectar el Sync Gateway a Couchbase Server es tan sencillo como cambiar <code>morsa:<\/code> al host de su instancia de Couchbase Server.<\/p>\n<p>Para ejecutar Sync Gateway desde la l\u00ednea de comandos debe ejecutar:<\/p>\n<pre><code>\/ruta\/hacia\/sync_gateway \/ruta\/hacia\/sync-gateway-config.json<\/code><\/pre>\n<p>Se crear\u00e1 un panel de control al que se podr\u00e1 acceder desde https:\/\/localhost:4985\/_admin\/. A nivel de aplicaci\u00f3n, utilizar\u00e1 el puerto 4984.<\/p>\n<h2 id=\"including-synchronization-logic-for-couchbase-and-nativescript\">Incluyendo l\u00f3gica de sincronizaci\u00f3n para Couchbase y NativeScript<\/h2>\n<p>Todo est\u00e1 completo para preparar la replicaci\u00f3n de datos en nuestra aplicaci\u00f3n. La replicaci\u00f3n de datos nos permitir\u00e1 utilizar escuchadores de cambios para actualizar nuestra interfaz de usuario seg\u00fan sea necesario.<\/p>\n<p>Abra el archivo <strong>app\/components\/profile-list\/profile-list.ts<\/strong> e incluya lo siguiente dentro del <code>ngOnInit<\/code> m\u00e9todo:<\/p>\n<pre><code>public ngOnInit() {\r\n    this.location.subscribe(() =&gt; {\r\n        this.refresh();\r\n    });\r\n    this.couchbase.startSync(\"https:\/\/192.168.57.1:4984\/example\", true);\r\n    this.database.addDatabaseChangeListener((changes) =&gt; {\r\n        for (let i = 0; i &lt; changes.length; i++) { let document = this.database.getDocument(changes[i].getDocumentId()); this.zone.run(() =&gt; {\r\n                this.profiles.push(document);\r\n            });\r\n        }\r\n    });\r\n    this.refresh();\r\n}<\/code><\/pre>\n<p>Cuando el <code>ngOnInit<\/code> iniciamos la sincronizaci\u00f3n con nuestro Sync Gateway local. Si\u00e9ntase libre de establecer el nombre de host a lo que sea apropiado para usted. Despu\u00e9s de iniciar la sincronizaci\u00f3n, configuramos nuestro oyente de cambios para empujar los cambios en nuestro <code>perfiles<\/code> array. Como se trata de un oyente, necesitamos utilizar <code>NgZone<\/code> de lo contrario no se reflejar\u00e1 en la interfaz de usuario.<\/p>\n<p>Lo anterior es s\u00f3lo un ejemplo sencillo en el que a\u00f1adimos todos los cambios. En realidad, tendr\u00e1 que comprobar si los datos han cambiado, se han creado o se han eliminado. Todos los escenarios vendr\u00edan a trav\u00e9s de la <code>addDatabaseChangeListener<\/code>.<\/p>\n<p>Cuando la aplicaci\u00f3n se detiene, queremos detener la sincronizaci\u00f3n. En el <code>ngOnDestroy<\/code> m\u00e9todo, incluya lo siguiente:<\/p>\n<pre><code>public ngOnDestroy() {\r\n    this.couchbase.stopSync();\r\n}<\/code><\/pre>\n<p>La replicaci\u00f3n a Couchbase Sync Gateway se detendr\u00e1 cuando se llame al m\u00e9todo Angular anterior.<\/p>\n<h2 id=\"conclusion\">Conclusi\u00f3n<\/h2>\n<p>En este tutorial has visto c\u00f3mo a\u00f1adir soporte de sincronizaci\u00f3n a tu aplicaci\u00f3n m\u00f3vil Angular NativeScript. Esta fue la tercera parte de tres en la serie de tutoriales. Anteriormente vimos c\u00f3mo hacer <a href=\"https:\/\/www.couchbase.com\/blog\/es\/key-value-operations-in-couchbase-mobile-via-nativescript-and-angular\/\">operaciones b\u00e1sicas de Couchbase para guardar y cargar datos<\/a> as\u00ed como <a href=\"https:\/\/www.couchbase.com\/blog\/es\/querying-for-couchbase-documents-in-a-nativescript-angular-mobile-application\/\">b\u00fasqueda de documentos<\/a>. Data en el desarrollo de aplicaciones m\u00f3viles utilizando frameworks como <a href=\"https:\/\/www.nativescript.org\">NativeScript<\/a> y Angular deber\u00eda ser f\u00e1cil. 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.<\/p>","protected":false},"excerpt":{"rendered":"<p>Over the past few days we&#8217;ve been exploring how to create a simple Android and iOS application using NativeScript, Angular and Couchbase. First we saw how to use Couchbase for basic key-value operations and then we saw how to query [&hellip;]<\/p>","protected":false},"author":63,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1815,1810,9327,2366],"tags":[1704,1543,1589,1562],"ppma_author":[9032],"class_list":["post-2490","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practices-and-tutorials","category-couchbase-mobile","category-javascript","category-sync-gateway","tag-angular","tag-javascript","tag-nativescript","tag-replication"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.2 (Yoast SEO v26.2) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Syncing Couchbase Documents Between Mobile Platforms and Devices with NativeScript and Angular - The Couchbase Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/es\/syncing-couchbase-documents-between-mobile-platforms-and-devices-with-nativescript-and-angular\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Syncing Couchbase Documents Between Mobile Platforms and Devices with NativeScript and Angular\" \/>\n<meta property=\"og:description\" content=\"Over the past few days we&#8217;ve been exploring how to create a simple Android and iOS application using NativeScript, Angular and Couchbase. First we saw how to use Couchbase for basic key-value operations and then we saw how to query [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/syncing-couchbase-documents-between-mobile-platforms-and-devices-with-nativescript-and-angular\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/thepolyglotdeveloper\" \/>\n<meta property=\"article:published_time\" content=\"2017-01-11T15:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T03:15:27+00:00\" \/>\n<meta name=\"author\" content=\"Nic Raboy, Developer Advocate, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@nraboy\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Nic Raboy, Developer Advocate, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/syncing-couchbase-documents-between-mobile-platforms-and-devices-with-nativescript-and-angular\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/syncing-couchbase-documents-between-mobile-platforms-and-devices-with-nativescript-and-angular\/\"},\"author\":{\"name\":\"Nic Raboy, Developer Advocate, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1\"},\"headline\":\"Syncing Couchbase Documents Between Mobile Platforms and Devices with NativeScript and Angular\",\"datePublished\":\"2017-01-11T15:00:00+00:00\",\"dateModified\":\"2025-06-14T03:15:27+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/syncing-couchbase-documents-between-mobile-platforms-and-devices-with-nativescript-and-angular\/\"},\"wordCount\":1126,\"commentCount\":4,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/syncing-couchbase-documents-between-mobile-platforms-and-devices-with-nativescript-and-angular\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"Angular\",\"javascript\",\"nativescript\",\"replication\"],\"articleSection\":[\"Best Practices and Tutorials\",\"Couchbase Mobile\",\"JavaScript\",\"Sync Gateway\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/syncing-couchbase-documents-between-mobile-platforms-and-devices-with-nativescript-and-angular\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/syncing-couchbase-documents-between-mobile-platforms-and-devices-with-nativescript-and-angular\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/syncing-couchbase-documents-between-mobile-platforms-and-devices-with-nativescript-and-angular\/\",\"name\":\"Syncing Couchbase Documents Between Mobile Platforms and Devices with NativeScript and Angular - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/syncing-couchbase-documents-between-mobile-platforms-and-devices-with-nativescript-and-angular\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/syncing-couchbase-documents-between-mobile-platforms-and-devices-with-nativescript-and-angular\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2017-01-11T15:00:00+00:00\",\"dateModified\":\"2025-06-14T03:15:27+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/syncing-couchbase-documents-between-mobile-platforms-and-devices-with-nativescript-and-angular\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/syncing-couchbase-documents-between-mobile-platforms-and-devices-with-nativescript-and-angular\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/syncing-couchbase-documents-between-mobile-platforms-and-devices-with-nativescript-and-angular\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/syncing-couchbase-documents-between-mobile-platforms-and-devices-with-nativescript-and-angular\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Syncing Couchbase Documents Between Mobile Platforms and Devices with NativeScript and Angular\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1\",\"name\":\"Nic Raboy, Developer Advocate, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/8863514d8bed0cf6080f23db40e00354\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g\",\"caption\":\"Nic Raboy, Developer Advocate, Couchbase\"},\"description\":\"Nic Raboy is an advocate of modern web and mobile development technologies. He has experience in Java, JavaScript, Golang and a variety of frameworks such as Angular, NativeScript, and Apache Cordova. Nic writes about his development experiences related to making web and mobile development easier to understand.\",\"sameAs\":[\"https:\/\/www.thepolyglotdeveloper.com\",\"https:\/\/www.facebook.com\/thepolyglotdeveloper\",\"https:\/\/x.com\/nraboy\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/nic-raboy-2\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Syncing Couchbase Documents Between Mobile Platforms and Devices with NativeScript and Angular - The Couchbase Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/es\/syncing-couchbase-documents-between-mobile-platforms-and-devices-with-nativescript-and-angular\/","og_locale":"es_MX","og_type":"article","og_title":"Syncing Couchbase Documents Between Mobile Platforms and Devices with NativeScript and Angular","og_description":"Over the past few days we&#8217;ve been exploring how to create a simple Android and iOS application using NativeScript, Angular and Couchbase. First we saw how to use Couchbase for basic key-value operations and then we saw how to query [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/es\/syncing-couchbase-documents-between-mobile-platforms-and-devices-with-nativescript-and-angular\/","og_site_name":"The Couchbase Blog","article_author":"https:\/\/www.facebook.com\/thepolyglotdeveloper","article_published_time":"2017-01-11T15:00:00+00:00","article_modified_time":"2025-06-14T03:15:27+00:00","author":"Nic Raboy, Developer Advocate, Couchbase","twitter_card":"summary_large_image","twitter_creator":"@nraboy","twitter_misc":{"Written by":"Nic Raboy, Developer Advocate, Couchbase","Est. reading time":"8 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/syncing-couchbase-documents-between-mobile-platforms-and-devices-with-nativescript-and-angular\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/syncing-couchbase-documents-between-mobile-platforms-and-devices-with-nativescript-and-angular\/"},"author":{"name":"Nic Raboy, Developer Advocate, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1"},"headline":"Syncing Couchbase Documents Between Mobile Platforms and Devices with NativeScript and Angular","datePublished":"2017-01-11T15:00:00+00:00","dateModified":"2025-06-14T03:15:27+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/syncing-couchbase-documents-between-mobile-platforms-and-devices-with-nativescript-and-angular\/"},"wordCount":1126,"commentCount":4,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/syncing-couchbase-documents-between-mobile-platforms-and-devices-with-nativescript-and-angular\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["Angular","javascript","nativescript","replication"],"articleSection":["Best Practices and Tutorials","Couchbase Mobile","JavaScript","Sync Gateway"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/syncing-couchbase-documents-between-mobile-platforms-and-devices-with-nativescript-and-angular\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/syncing-couchbase-documents-between-mobile-platforms-and-devices-with-nativescript-and-angular\/","url":"https:\/\/www.couchbase.com\/blog\/syncing-couchbase-documents-between-mobile-platforms-and-devices-with-nativescript-and-angular\/","name":"Syncing Couchbase Documents Between Mobile Platforms and Devices with NativeScript and Angular - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/syncing-couchbase-documents-between-mobile-platforms-and-devices-with-nativescript-and-angular\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/syncing-couchbase-documents-between-mobile-platforms-and-devices-with-nativescript-and-angular\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2017-01-11T15:00:00+00:00","dateModified":"2025-06-14T03:15:27+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/syncing-couchbase-documents-between-mobile-platforms-and-devices-with-nativescript-and-angular\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/syncing-couchbase-documents-between-mobile-platforms-and-devices-with-nativescript-and-angular\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/syncing-couchbase-documents-between-mobile-platforms-and-devices-with-nativescript-and-angular\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/syncing-couchbase-documents-between-mobile-platforms-and-devices-with-nativescript-and-angular\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Syncing Couchbase Documents Between Mobile Platforms and Devices with NativeScript and Angular"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"El blog de Couchbase","description":"Couchbase, la base de datos NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1","name":"Nic Raboy, Defensor del Desarrollador, Couchbase","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/8863514d8bed0cf6080f23db40e00354","url":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","caption":"Nic Raboy, Developer Advocate, Couchbase"},"description":"Nic Raboy es un defensor de las tecnolog\u00edas modernas de desarrollo web y m\u00f3vil. 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\u00f3vil m\u00e1s f\u00e1cil de entender.","sameAs":["https:\/\/www.thepolyglotdeveloper.com","https:\/\/www.facebook.com\/thepolyglotdeveloper","https:\/\/x.com\/nraboy"],"url":"https:\/\/www.couchbase.com\/blog\/es\/author\/nic-raboy-2\/"}]}},"authors":[{"term_id":9032,"user_id":63,"is_guest":0,"slug":"nic-raboy-2","display_name":"Nic Raboy, Developer Advocate, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","author_category":"","last_name":"Raboy","first_name":"Nic","job_title":"","user_url":"https:\/\/www.thepolyglotdeveloper.com","description":"Nic Raboy es un defensor de las tecnolog\u00edas modernas de desarrollo web y m\u00f3vil. 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\u00f3vil m\u00e1s f\u00e1cil de entender."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/2490","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/63"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=2490"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/2490\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=2490"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=2490"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=2490"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=2490"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}