Marco iónico se ha convertido recientemente en uno de los frameworks móviles más populares. Facilita enormemente la creación de grandes interfaces de usuario para aplicaciones móviles. Sin embargo, parte del reto consiste también en gestionar los datos, obteniéndolos del servidor back-end y guardándolos localmente para cuando el dispositivo no esté conectado.

Couchbase Mobile se encarga de esto por ti y con el plugin de Apache Cordova, ¡es pan comido!

En este tutorial aprenderás a:

  • Incluye Couchbase Lite en tu proyecto Ionic.
  • Utiliza los componentes de Ionic UI para mostrar los datos en pantalla.
  • Ejecute la aplicación en el simulador iOS / Android.

Requisitos previos

  • Ionic Framework 1.0+
  • Apache Cordova 5.0+
  • El SDK de Android si construyes para Android
  • Un Mac con Xcode instalado si se construye para iOS

Primeros pasos

Antes de empezar a codificar es importante que creemos un nuevo proyecto y configuremos todos los plugins y componentes necesarios. Desde el símbolo del sistema (Windows) o Terminal (Mac / Linux), ejecuta lo siguiente para crear un nuevo proyecto Ionic:

Recuerda que si no utilizas un Mac, no puedes añadir ni crear para la plataforma iOS.

Para que este proyecto tenga éxito, hay algunos Apache Cordova que deben ser instalados. Con el proyecto Ionic como directorio de trabajo actual en el Símbolo del sistema o Terminal, ejecute los siguientes comandos:

Esto instalará el plugin Apache Cordova whitelist que nos permitirá comunicarnos con servicios externos y el plugin Couchbase PhoneGap que permitirá usar Couchbase en nuestra aplicación.

Inclusión de la biblioteca RESTful de AngularJS

El uso de Couchbase Lite se realiza a través de las API RESTful expuestas mediante el plugin Apache Cordova. Una lista completa de estos puntos finales de la API se puede encontrar en el documentación oficial de Couchbase. Sin embargo, existe un AngularJS para facilitar la llamada a estos puntos finales.

Descargar la última ng-couchbase-lite que se encuentra en GitHub e incluye el archivo ng-couchbase-lite.min.js que se encuentra en el archivo dist en el directorio www/js/ carpeta.

Con el archivo incluido en su proyecto, abra el archivo index.html e incluya el archivo JavaScript de la siguiente manera:

Observe que la secuencia de comandos se incluyó sobre el proyecto www/js/app.js.

Lo último que hay que hacer antes de usar ng-couchbase-lite es inyectarlo en AngularJS. Esto se puede hacer abriendo el archivo www/js/app.js y cambiando el módulo.angular para que parezca lo siguiente:

La envoltura AngularJS ahora se puede utilizar a través del proyecto.

Pulir el fichero índice

Es necesario hacer algunos ajustes en el proyecto de www/index.html para aprovechar al máximo este tutorial. El primero de los cuales es la adición de alguna información meta para complementar el plugin de listas blancas. Es más necesario para Android que para iOS. Cerca de la otra meta incluya lo siguiente:

Esto sólo indica a tu proyecto que quieres trabajar con ciertos scripts.

El otro ajuste que quieres hacer es dentro de tu cuerpo etiquetas. Sustituya todo lo que hay dentro del cuerpo por lo siguiente:

Usted debe ser bueno para ir en este punto

Uso de una variable global de base de datos

Para ahorrarnos la molestia de tener que abrir la base de datos en cada vista, vamos a crear una variable global al proyecto. En el directorio www/js/app.js archivo siguiente módulo.angular incluyen lo siguiente:

Esto se establecerá más tarde cuando inicialicemos la base de datos.

Configuración del router de interfaz de usuario

Ionic Framework utiliza el UI-Router de AngularJS, por lo que vamos a aprovecharlo a la hora de manejar nuestras vistas y controladores. Dentro del proyecto www/js/app.js añada el siguiente código:

Tenemos dos rutas, una a nuestra vista de listas y otra a nuestra vista de tareas. Sin embargo, la vista de tareas requiere un parámetro adicional que identificamos como listId. Esto se debe a que cuando navegamos a la vista de tareas queremos proporcionar el elemento de lista padre al que pertenece la tarea. Esto nos ayudará a consultar nuestros datos. Ignora los controladores por ahora, porque los crearemos más tarde.

Inicialización de la base de datos y las vistas

Lo primero que hay que hacer cuando se utiliza el plugin PhoneGap de Couchbase es crear una base de datos. Después, puedes registrar vistas para consultar los documentos que residirán en la base de datos. Las vistas de Couchbase son consultas map/reduce que construyen el índice incrementalmente a medida que se guardan nuevos documentos en la base de datos. Son completamente diferentes a las vistas de interfaz de usuario.

Dentro de la sección www/js/app.js vamos a incluir algunas cosas en el archivo AngularJS ejecute método:

Esto es lo que ocurre paso a paso:

  1. Primero compruebe que el plugin existe (instalado y en funcionamiento). Si existe, a continuación, crear una nueva base de datos si la base de datos deseada no existe ya. Si la creación de la base de datos es exitosa, vamos a crear dos vistas, una para obtener las listas de tareas pendientes, y otra para obtener las tareas. Para este tutorial, la base de datos que estamos creando se llama todo.
  2. Vamos a crear una vista llamada tareas y enumeratanto dentro del diseño/todo documento de diseño. En cuanto a las vistas de Couchbase. El enumera devolverá todos los documentos que tengan un tipo.doc de lista y que tienen un título propiedad. Sin embargo, sólo el título y la revisión del documento se devuelven con el id del documento. Esto se hace para aligerar el proceso. La dirección tareas devolverá todos los documentos que tengan un tipo.doc de tarea así como algunos título propiedad y padre lista_id propiedad. En esta vista en particular, sólo se devuelven el título, la revisión del documento y el id de la lista con el id del documento.

Creación de los controladores

Controlador de la lista de tareas

Dentro de la www/js/app.js de su proyecto, cree el siguiente controlador:

Una pequeña explicación sobre nuestros planes El $scope.listas contendrá todos los documentos Couchbase a los que la vista en particular tendrá acceso. $scope.insert por supuesto será responsable de insertar datos en Couchbase Lite y $scope.delete se encargará de borrar los datos.

Así que empezando por el $scope.insert función:

En lugar de crear una vista separada para insertar los datos, utilizaremos un archivo $ionicPopup. Con el resultado lo estamos añadiendo a un objeto y también añadiendo un tipo de documento para futuras referencias. A continuación, este objeto se inserta en la base de datos, momento en el que se puede optar por realizar determinadas tareas en función de su éxito o fracaso.

La siguiente función de la que hay que preocuparse es $scope.delete función:

Aquí ocurren varias cosas. En primer lugar, intentamos eliminar el documento de la lista a través del id y la revisión concretos. Si lo conseguimos, consultamos nuestra vista de tareas en busca de cualquier tarea cuyo padre sea nuestro documento recién creado. Acotamos nuestra búsqueda haciendo uso de la función clave_inicio opción. Para cada documento de tarea que coincida, elimínelo también para que no quede huérfano al eliminar el documento principal.

El parámetro que se pasa a la función eliminar es un objeto.

Pero, ¡un momento! ¿Cómo buscamos documentos para mostrarlos en nuestra lista? Lo que vamos a hacer tiene dos partes. La primera consiste en consultar la vista que creamos al crear una nueva base de datos. Esto se puede hacer de la siguiente manera:

Esto buscará listas de tareas en la vista cuando ésta se cargue, pero ¿cómo buscar cambios constantemente? Desde que empezamos a escuchar los cambios en el ejecute podemos elegir mostrar lo que hemos oído:

El código anterior escuchará el couchbase:cambiar evento. Si se activa, hará un bucle a través de todos los cambios y determinará si va a borrar un documento de la lista o si va a insertar un documento en la lista. Digo upserting porque lo insertará si no existe o lo actualizará si existe.

El controlador de hojas de ruta

Dentro de la www/js/app.js de su proyecto, cree el siguiente controlador:

Aquí están ocurriendo algunas cosas. El $scope.todoList contiene el identificador de la lista que se pasó desde la vista anterior de la lista de tareas. Es el identificador de la lista seleccionada. En $scope.tasks es similar a lo que vimos en el TodoListsController con el $scope.listas objeto. Esta vez sólo almacenará información sobre la tarea. La dirección $scope.insert y $scope.delete también será muy similar a lo que vimos en el TodoListsController. Sin embargo, $scope.volver es nuevo y se encarga de llevarnos un nivel hacia atrás en la pila del historial al pulsar la flecha hacia atrás dentro de la aplicación.

Así que vamos a llenar estas funciones con un poco de código, comenzando con el $scope.insert función:

Al igual que en el otro controlador, éste también utilizará la función $ionicPopup para introducir datos. El resultado se añadirá a un objeto con un tipo y el id de la lista a la que pertenece esta tarea secundaria. A continuación, este objeto se inserta en la base de datos.

Lo siguiente es la funcionalidad de borrado para eliminar tareas de Couchbase Lite:

Fíjate en lo mucho más fácil que resulta esta función de borrado en comparación con el borrado de listas. Esto se debe a que no tenemos que preocuparnos por los datos huérfanos. Sólo hay que introducir el id de la tarea y la revisión a borrar y ya está.

Volviendo a la función back encargada de devolvernos a la lista de tareas pendientes:

Nada especial aquí, pero es importante porque los dispositivos iOS no tienen un botón de retroceso de hardware. Menos importante para Android, pero todavía bueno tener para la consistencia.

Al igual que con nuestro controlador de lista de tareas, tenemos que preocuparnos de presentar los datos en pantalla. De hecho será muy similar a lo que vimos en el otro controlador. Empezando por consultar la vista de tareas:

En el código anterior estamos consultando la vista, pero también comprobando que los resultados del documento comparten el mismo padre de la lista de tareas, mediante el uso de la propiedad clave_inicio. Si los resultados coinciden, añádalos a nuestro objeto de tareas.

En cuanto a nuestro oyente, de nuevo será muy similar a lo que ya hemos visto:

En lugar de filtrar por listas, filtramos por tareas.

Creación de vistas de interfaz

Habrá dos vistas en esta aplicación:

  • Una vista para crear, visualizar y eliminar listas
  • Una vista para crear, visualizar y eliminar tareas

El diseño y la funcionalidad entre ambos serán casi idénticos. Si un www/plantillas no existe ya en tu proyecto, créalo.

Vista de la lista de tareas

En la sección www/plantillascree un nuevo archivo llamado todolistas.html y añade el siguiente código:

Hay que tener en cuenta algunas cosas sobre lo que se ve arriba. En primer lugar, habrá un botón de navegación con un icono más que será la forma en que los usuarios crean nuevas listas. Al hacer clic, se llamará a la insertar() que hemos creado en nuestro controlador. La siguiente cosa a notar es cómo hemos elegido crear nuestro método lista de iones. Hemos optado por darle funciones de deslizamiento similares a las aplicaciones de correo comunes para iOS y Android. Esto se combina con la función ion-option-button que usaremos para borrar listas.

El último punto de este punto de vista es la ng-repeat que utilizamos para recorrer todas las listas. Cuando hacemos clic en un elemento de la lista, el id de la lista se pasa a través de la variable ui-sref llamar.

Vista de la lista de tareas

En la sección www/plantillascree un nuevo archivo llamado tareas.html y añade el siguiente código:

De nuevo, es muy similar a la vista de lista de tareas. Sin embargo, hay dos diferencias importantes entre las dos. En primer lugar, observe que esta vista tiene un botón izquierdo con un icono de flecha que llama a nuestro atrás() método. Ahora tenemos dos botones de menú en esta pantalla. En segundo lugar, observe el botón ng-if que existe en la repetición ion-item etiqueta. Sólo queremos mostrar la tarea si tiene un padre que coincida con la lista que hemos elegido.

Probar el proyecto

Pruebas para Android

Con un dispositivo conectado o un simulador en ejecución, desde el símbolo del sistema o el terminal, ejecute los dos comandos siguientes para crear e instalar el archivo APK:

Pruebas para iOS

Hay dos buenas maneras de hacer esto. Puedes construir el proyecto y abrirlo con Xcode, o puedes construir y emular la aplicación sin lanzar Xcode. El primero se puede hacer así:

A continuación, abra el proyecto plataforma/ios/ e inicie el archivo de proyecto de Xcode.

Si ha instalado el paquete Node Package Manager (NPM) ios-simpuede hacer lo siguiente:

Resolver cualquier problema de dependencia de Gradle

En tiempo de compilación para Android, puede encontrarse con el siguiente mensaje de error:

Para solucionarlo, debe ampliar el archivo de compilación de Gradle para Android como se indica en el documento documentación oficial de Apache Cordova.

Cree platforms/android/build-extras.gradle en tu proyecto y añade lo siguiente:

Conclusión

Usando el plugin PhoneGap de Couchbase, hemos creado una aplicación móvil de listas de tareas que realiza todas las transacciones localmente. Usamos AngularJS para conectarnos fácilmente a los endpoints RESTful que Couchbase Lite expone.

En siguiente tutorial de Ionic Framework en esta serie repasará cómo replicar datos entre el dispositivo local y Couchbase Sync Gateway para que los datos puedan ser compartidos entre dispositivos y plataformas.

Esta serie puede descargarse íntegramente de Couchbase Labs GitHub página.

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.

104 Comentarios

  1. Demasiado acoplamiento a otros componentes en las vistas. Tal vez colocar la lógica de inserción/actualización/eliminación en clases de acción separadas para desacoplarlas de cualquier interfaz de usuario en particular, y luego llamarlas cuando los desencadenantes de inserción/actualización/eliminación se envían desde la vista. p. ej.

    1. Gracias por tu comentario.

      Creo que se reduce a la preferencia como no he leído en la documentación de Ionic para hacer o no hacer eso. No estoy en desacuerdo contigo ya que creo que tienes un enfoque muy válido, pero creo que puede ser demasiado avanzado para muchos lectores de este tutorial. Yo estaba tratando de dar cabida a todos los desarrolladores, principiantes y experimentados.

      Gracias de nuevo por su sugerencia :-)

  2. Cuando ejecuto el proyecto git en el emulador iOS (ionic emulate ios), falla al crear la base de datos. el error devuelto es simplemente null. ¿Qué puede estar pasando?

    Aquí está la solicitud: {\ "método":\ "PUT",\ "url":\ "http://lite.couchbase./todo",\ "withCredentials":true}y la respuesta: {"data":null,{\}"status":0,{\}"config":{\}"method":{\}"PUT",{\}"transformRequest":[null],{\}"transformResponse":[null],{\}"url":{\}"http://lite.couchbase./todo\",\"withCredentials\":true,\"headers\":{\"Accept\":\"application/json, text/plain, */*\"}},\"statusText":\"\"\"}

    1. ¡Eso es raro!

      ¿En qué versión de iOS estás probando y qué versión de Apache Cordova? ¿Puedo confirmar que ha instalado todos los plugins necesarios DESPUÉS de añadir la plataforma iOS?

      Gracias,

      1. Josip Bosnjak marzo 7, 2016 a 4:01 pm

        Estoy teniendo exactamente el mismo problema. createDatabase() está siendo llamado y va a error callback, error es null.

        Estoy ejecutando la aplicación en Samsung Galaxy S3.

        1. ¿Puede darme más información? ¿Versión de Android? ¿Cómo estás desplegando? etc.

          Lo mejor,

          1. Josip Bosnjak marzo 8, 2016 a 10:43 am

            Android 4.1.2. Estoy desplegando en el dispositivo usando ionic build android -> ionic run android.

            No obstante, por si sirve de ayuda, lo he ejecutado en el emulador de ios y funciona.

          2. Le he abierto un ticket aquí:

            https://github.com/couchbase/c

            Lo mejor,

          3. ¿Sigues teniendo problemas con esto?

          4. Tengo el mismo problema al ejecutar la app TodoliteIonic createDatabase promise es rechazada pero el error está vacío. No puedo ver nada en el logcat aparte de mis registros antes y después de error
            Ejecutando android 4.2.2
            En otro dispositivo con 5.0.2
            Veo Fallo al cargar recurso: el servidor respondió con un estado de 403 (Prohibido)

            Funciona bien en android 6+

          5. Hola Frank, ¿puedes pegar el logcat completo de cada dispositivo que ha fallado? Siéntase libre de utilizar comentarios separados para cada uno.

            Gracias,

          6. Ahora mismo estoy lejos de mi ordenador, pero he investigado un poco más y he descubierto que en los dispositivos que fallan falta el encabezado de autorización.
            Ni idea de cómo se está configurando en los dispositivos que funcionan, pero sin duda está ahí.

            Enviaré mis registros tan pronto como pueda.

          7. Ok I\ he cavado en el plugin de Android y encontré esto

            Credenciales requestCredentials = credentialsWithBasicAuthentication(request);

            if (allowedCredentials != null && !allowedCredentials.empty()) {

            if (requestCredentials == null || !requestCredentials.equals(allowedCredentials)) {

            Log.d(Log.TAG_LISTENER, \"Unauthorized - requestCredentials not given or do not match allowed credentials\");

            response.setHeader(\"WWW-Authenticate\", \"Basic realm="Couchbase Lite\"\");

            response.setStatus(401);

            volver;

            ////Por alguna razón no recibimos un 401 en el dispositivo. El error devuelto es null

            }

            Log.v(Log.TAG_LISTENER, \"Autorizado mediante autenticación básica");

            } else {

            Log.v(Log.TAG_LISTENER, \"Not enforcing basic auth - allowedCredentials null or empty\");

            }

            credentialsWithBasicAuthentication(request) devuelve null en algunos dispositivos porque no se ha establecido el encabezado Basic Authorisation.

            No estoy configurando esto en ninguna parte. Para solucionar esto he tenido que modificar makeRequest en ng-couchbase-lite.js a

            makeRequest: function(method, url, params, data) {

            var deferred = $q.defer();

            var settings = {

            método: método,

            url: url,

            withCredentials: true,

            cabeceras: {

            \Autorización: this.auth

            }

            };

            if (params) {

            settings.params = params;

            }

            si (datos) {

            settings.data = datos;

            }

            $http(configuración)

            .success(function(result) {

            deferred.resolve(result);

            })

            .error(function(error) {

            deferred.reject(error);

            });

            return deferred.promise;

            }

            Donde this.auth es una cadena codificada en Base64 de la información devuelta por cblite.getURL

            Aunque esto no parece haber roto nada, me gustaría entender cómo se establece el encabezado de autorización en los dispositivos que funcionaban.

          8. Interesante...

            ¿Estás usando una ROM personalizada para Android por casualidad? Me pregunto si esto es una cosa Angular, menos de una cosa Couchbase. Si sus dispositivos están procesando JavaScript de manera diferente, entonces tal vez ese es el problema. ¿Qué tipo de dispositivos o emuladores estás usando para cada una de estas versiones de Android?

            Lo mejor,

          9. Lo siento por la respuesta tardía estado fuera :-)
            Todos los dispositivos Android tienen una ROM estándar. Estoy de acuerdo en que se parece más a un problema Angular pero no puedo ver donde la información de autenticación básica se estaba configurando.

          10. Tal vez quieras llevar esto a los foros

  3. ¡Excelente tutorial!
    Sirve incluso como introducción a Ionic.

    Pequeño consejo: quizá añadiendo el enlace a la segunda parte del artículo sea más fácil para el lector seguirlo ;)

    1. Gracias por el consejo. He enlazado este primer artículo con el segundo de la serie :-)

  4. Hola,

    ¿cómo puedo averiguar la ruta de js-lib utilizado por CS?
    ¿Y cómo puedo añadir js-lib definido por sef a CS?

    1. Estoy un poco confundido:

      1. ¿A qué se refiere cuando dice "js-lib"?
      2. ¿A qué "js-lib autodefinido" se refiere?

      Lo mejor,

      1. Hola,
        Quiero saber de donde viene la función js nativa .
        Y si quiero definir mis conjuntos de funciones js, los guardaré en un archivo con el nombre .js extent, ¿dónde debo poner el archivo js?

        1. Sigo confundido. ¿De qué función js nativa estás hablando?

          Por favor, sea muy descriptivo ya que me permitirá ayudarle mejor.

          Lo mejor,

          1. ej: ¿de dónde viene la función filter? ¿parseInt?

          2. ¿Se refiere al interior del evento de cambio? En caso afirmativo, sólo nos estamos refiriendo a una propiedad concreta de los documentos NoSQL.

            Si se refiere a otra cosa, por favor, sea específico. Cuanta más información me facilite, mejor podré ayudarle.

            Saludos,

          3. Gracias.
            Y en face , quiero saber que funciones incorporadas puedo utilizar?
            ¿Existe una función integrada como "subcadena"?

            ¿El CS importa el underscore.js?

          4. Hola,
            ¿el cs sólo posee 10 cubos?

  5. Gracias por el tutorial.

    Cuando intento ejecutar esto en mi Android 6, Nexus 5, me sale el error "invalid database" en el paso createDatabase. Puede usted por favor me ayude a averiguar lo que podría estar mal.

    Gracias

    1. ¿Qué dicen sus registros completos?

      1. Perdón por la pregunta n00b Nic, pero ¿dónde puedo encontrar los registros y cómo puedo habilitarlo en el entorno iónico?

        1. Al parecer, si tengo un carácter en mayúscula en el nombre de la base de datos, falla. Cuando sólo utilizo minúsculas, ¡funciona!

          1. Me alegra saber que lo has conseguido :-)

        2. Para Android, puede ver lo siguiente para obtener información detallada del registro:

          https://blog.nraboy.com/2014/1

          Para iOS puedes ver tus registros siguiendo estos pasos:

          https://blog.nraboy.com/2015/1

          Lo mejor,

  6. Gracias por este bonito ejemplo:-) ¿Cómo puedo hacer una replicación filtrada (diferentes canales)? Por ejemplo en este método:
    replicar: function(origen, destino, continuo) {
    return this.makeRequest(\"POST\", this.databaseUrl + \"_replicate\", {}, {source: source, target: target, continuous: continuous});
    },
    ¿Existe un método para filtrar la replicación? Gracias por su ayuda.

    1. James Nocentini noviembre 5, 2015 a 9:22 pm

      ¿Desea filtrar en función del usuario autenticado o como usuario invitado (es decir, no autenticado)? Puede crear usuarios y luego conceder a un usuario acceso a un conjunto de canales. En ese caso especificaría una sesión de cookie en el cuerpo de la petición del método _replicate. O podría decirle al replicador que sólo extraiga documentos de un canal en particular. Consulte la referencia de la api _replicate para ver un ejemplo del uso de la cookie de sesión. http://developer.couchbase.com
      Aunque faltan explicaciones sobre cómo especificar los nombres de los canales. Le echaré un vistazo y te lo haré saber.

      1. Gracias por su rápida respuesta. Sería bueno si usted puede hacer eso. Quiero sacar los documentos como usuario invitado.
        En los documentos hay un campo para los canales .. canales:[\ "user123\", \ "user1234\"].....¿Entonces la Url tiene que verse así?
        http://sync.couchbasecloud.com... . para obtener sólo los documentos del canal user123. También tengo otra pregunta, ¿puedo obtener el progreso de la extracción o una información cuando haya terminado?

        1. La URL que ha pegado arriba obtendría los documentos directamente de Sync Gateway. También puede indicar al replicador que solo extraiga documentos de un canal específico con el siguiente cuerpo de solicitud en el POST /_replicate (aquí, el replicador solo extraerá documentos del canal nyc:
          {
          \"query_params\": {
          \"canales": \"nyc\"
          },
          \"filter": \sync_gateway/bychannel",
          \ "source\": {
          \"url": \http://localhost:4984/sg-test/
          },
          {\i1}"objetivo".{\i} {
          \url \"cblite-test"
          }
          }

          Para la información sobre el progreso, existe un punto final /_active_tasks para ello http://developer.couchbase.com

          1. gracias:-)

          2. Hola James, tengo una pregunta más a la sincronización por canal:

            El Server Doc tiene este aspecto:

            {
            \"hacer clic": \"editar",
            \"Nuevo en 2.0": \"no hay nombres de campos reservados",
            \"canales": [\"nyc\"]
            }

            ¿Es correcto que tengo que extender la biblioteca ng-couchbase-lite.js. He extendido este método:

            replicar: function(parámetros_consulta, filtro, fuente, objetivo, continuo) {

            return this.makeRequest(\"POST\", this.databaseUrl + \"_replicate\", {}, {query_params:query_params, filter:filter, source: source, target: target, continuous: continuous});

            },

            Esta es mi réplica de Call:

            Database.replicate({"channels\": [\"nyc\"]}, \"sync_gateway/bychannel\" , dbName, \"http://104.155.79.21:4984/bucket_db_sync\", true).then(function(result) {
            console.log(resultado);
            Database.replicate({"channels\": [\"nyc\"]}, \"sync_gateway/bychannel\" ,\"http://XXX.XXX.XXX.XXX:4984/bucket_db_sync\", dbName, true).then(function(result) {
            console.log(resultado);
            }, function(error) {
            console.log(\"ERROR DEVICE SYNC-> \" + JSON.stringify(error));
            });

            No funciona, me da error:

            ADVERTENCIA: CBL_Pusher[http://XXX.XXX.XXX.XXX:4984/monitoring_sync]: No filter \'sync_gateway/bychannel\' (err 404)

            ¿Hay alguna manera mejor, que no tenga que extender la biblioteca ng-couchbase-lite.js?

            Gracias por su respuesta.

          3. Si desea especificar varios canales, debe separarlos por comas en una cadena como ésta:

            {
            \"query_params\": {
            \"canales": \"nyc,london"
            },
            \"filter": \sync_gateway/bychannel",
            \ "source\": {
            \"url": \http://localhost:4984/sg-test/
            },
            {\i1}"objetivo".{\i} {
            \url \"cblite-test"
            }
            }

            ¿Funciona si cambias [\"nyc\"] por \"nyc\"? Sí, tendrás que cambiar la llamada a replicar api o crear una nueva.

  7. Hola Nic, ¿podrías dar ejemplos de cómo se añadiría un adjunto al documento y cómo se recuperaría más tarde? Cómo se haría referencia al archivo adjunto con un campo en el documento.

    Gracias.

    1. Me parece una idea perfecta para otro tutorial del blog :-)

  8. Hola soy nuevo couchbase db con node js. por favor, dígame cómo puedo crear databse en el servidor couchdb thenn cómo puedo realizar CURD opertaion en esto.

    1. Puede que quieras echar un vistazo a mi tutorial sobre la pila CEAN:

      https://blog.nraboy.com/2015/1

      Sustituye el AngularJS (A) por una plataforma móvil si eso es lo que prefieres.

      Lo mejor,

  9. Gracias por el tutorial Nic..

    Mi proyecto se construye bien sin el plugin instalado, pero después de instalar el plugin de construcción falla con el siguiente error ...

    versión de cordova : 5.4.1
    Versión de Ionic : 1.7.10

    1. Parece que sufres de lo que mencioné en esta sección:

      Resolver cualquier problema de dependencia de Gradle

      ¿Puede confirmar que ha seguido las instrucciones correctamente?

      Lo mejor,

      1. Gracias .. Eso hizo que funcionara.. :)

  10. Hola, mi amigo y yo estamos tratando de hacer que esto funcione, pero cada vez que obtenemos "Couchbase Lite no está instalado".
    Hemos seguido su guía paso a paso, pero sigue apareciendo el error.
    También hemos intentado descargar el código fuente desde el repositorio github de couchbaselabs, pero el error es el mismo.

    ¿Qué nos estamos perdiendo?
    Muchas gracias por la ayuda que nos puedan prestar.

    1. ¿Puede confirmar que no está intentando utilizar ionic serve, ionic view o ionic build? ¿Puede confirmar también que no está tratando de probar a través de un navegador web? Lo pregunto porque nada de lo que he mencionado funcionará. Es necesario compilar e instalar en el dispositivo o simulador.

      Lo mejor,

      1. Estaba intentando usar ionic serve y también la aplicación instalada en mi dispositivo android.

        ¿Por qué no puedo utilizar ionic serve o ionic view?

        Gracias

        1. Ionic serve y ionic view son alfa y en mi experiencia tienen muy poca compatibilidad con plugins.

          Lo mejor,

      2. Estoy recibiendo este error también. Y no estoy seguro de cómo saber si estoy usando ionic serve, ionic view, o ionic build?

        1. Guíame a través de los pasos de cómo pruebas tu aplicación. No te saltes nada. Por favor, incluya comandos también.

          Lo mejor,

          1. Jonas Rodrigues febrero 27, 2016 a 6:51 pm

            Yo también tuve el mismo problema. Lo resolví mediante la eliminación de mi plataforma, en este caso, android, y añadir de nuevo. Me parece que el problema se produce cuando se agrega la plataforma antes de añadir el plugin base couche.

          2. Sí, a veces Apache Cordova se vuelve loco con el orden en que se agregan las cosas.

  11. Cuando ejecuto el proyecto por segunda vez, no se crean listeners, ya que sólo parece ocurrir cuando se crea la base de datos. Además, cuando la lista se rellena con la función queryView no puedo eliminar elementos porque _id no está definido.

    ¿Podría explicarme cómo corregir ambos problemas?

  12. He respondido a mi propia pregunta. He detectado el código de estado 412 al crear la base de datos y he ajustado la vista de lista de tareas para incluir el valor _id.

    Bonito tutorial.

    Gracias

    1. ¡Impresionante! Me alegro de que lo hayas conseguido. Voy a hacer una revisión para corregir 412 errores en el relanzamiento de la aplicación.

  13. Hey, quiero preguntar algo, me encontré con la aplicación de trabajo, pero nada muestran en la aplicación, excepto el botón "+" y el formulario de entrada .. pero los datos no se muestran ...

    1. ¿Qué dicen sus registros?

      1. No hay error ..

        ¿O es que me he perdido algo?

        1. ¿Qué plataforma utiliza y cómo lo comprueba?

          1. yo uso la plataforma android y comprobar con google chrome

            ¿puedo preguntar algo? ¿qué sintaxis para mostrar los datos?

          2. Usted querrá comprobar sus registros a través de ADB, no Chrome. Usted puede leer lo siguiente para obtener más información:

            https://blog.nraboy.com/2014/1

            Cuando tengas tus logs, por favor, pégalos en los comentarios para que pueda echarles un vistazo.

            Lo mejor,

          3. Hola, puede que me haya perdido algo...

            Me confundí donde debo poner este sintaxis ...

          4. Sí, así es como se consulta la vista que has creado. Va en su controlador.

          5. He puesto el script en mi controlador, pero cuando lo compruebo con chrome, muestra este error

            Nota :
            - cuando compruebo en el "ng-couchbase-lite.min.js\", hay una función "queryView\", pero no puedo llamar en el app.js
            - Ya he añadido el "ng-couchbase-lite.min.js\" por encima de la "app.js\", pero, este error todavía vienen y no puedo ejecutar el programa

          6. Este plugin utiliza código nativo, por lo que no se puede probar en un navegador web.

          7. Estoy corriendo en el androide y el elemento de inspección en cromo utilizando depuración USB

          8. Suena como 'todoDatabase' es nulo entonces. ¿Está seguro de que lo definió y lo hizo global?

          9. Es una variable global, ¿verdad?

          10. Sí, ¿puede confirmar que se carga dentro de su módulo.run ¿método?

          11. Sí, mira la foto

            ¿Es eso cierto?

          12. Sí, pero ¿puedes confirmar que se ha cargado realmente? ¿El controlador que realiza la consulta es el primer controlador que se carga después del module.run? En caso afirmativo, probablemente se trate de una condición de carrera. Abrir la base de datos y configurar las vistas es asíncrono.

          13. ¿Cómo confirmarlo?

            Siento preguntar algo así, todavía soy novato :)

          14. Imprime la variable después de definirla y comprueba si es nula.

          15. Después de imprimir el "todoDatabase", y, tienes razón. Dice "null"

            ¿cómo solucionarlo?

          16. ¿Cuál estás imprimiendo? Supongo que estás haciendo lo siguiente:

            ¿Correcto?

          17. I https://uploads.disquscdn.com/...perdón por la respuesta tardía...

            aquí pongo el console.log ( lo pongo después de la etiqueta de cierre \"if(!window.cblite)\")

          18. Eso no es correcto ya que el getURL es asíncrono. Puede, y probablemente no ha, completado el proceso de inicialización.

          19. Ok, voy a tratar de console.log al igual que usted dice antes ?

          20. Este es el resultado del console.log

            *Puse después de este código \"todoDatabase = new $couchbase(url, \"todo\");\"

            https://uploads.disquscdn.com/

          21. Sí, se ha cargado. Estás sufriendo una condición de carrera en alguna parte (intentando usar la librería antes de que se haya cargado completamente). Siendo que AngularJS y este plugin es asíncrono, tienes que seguir las reglas del diseño.

            Te animo a que vuelvas a comprobar el código o clones el proyecto desde GitHub.

            Lo mejor,

  14. Sriram Madduri marzo 1, 2016 a 4:06 pm

    hola
    Estoy recibiendo queryView de error nulo

  15. Hola Nic,
    buen tutorial gracias por esto, pero tengo una pregunta ¿puedo crear vista según mi requisito no en la carga de aplicaciones.

    1. Sí, puede hacerlo.

      Además, por si no está claro, sólo tienes que crear una vista una vez. Una vez creada, se guarda en la base de datos local y se puede consultar en cualquier momento.

      Lo mejor,

      1. Hola Nic,
        gracias por la respuesta.
        Creo una vista en la carga de la aplicación y que la vista está funcionando correctamente, pero luego traté de crear otra vista en mi controlador (no en la carga de la aplicación) para llamar a la función mencionada a continuación

        $scope.createview = function() {
        var todoViews = {
        tareas: {
        map: function(doc) {
        if(doc.firstname=="Chandan\" ) {
        emit(doc._id, {nombre: doc.nombre, apellido: doc.apellido, email: doc.emailrev: doc._rev})
        }
        }.toString()
        }
        };
        todoDatabase.createDesignDocument(_design/todo\", todoViews);
        todoDatabase.listen();
        };

        pero devuelve el error mencionado a continuación:-
        PUT http://ad92e99d-385a-46b7-9358-5fcb44944091:40c43d4d-9fb0-484f-ba78-082bacb2208d@localhost:5984/todo/_design/todo 409 (Conflicto)

        por favor, cuidado.

        1. Debe crear todas las vistas de un documento de diseño al mismo tiempo. El conflicto se produce porque _design/todo ya existe.

          1. Hola Nic,
            Gracias por esto, me ha funcionado.
            pero tengo una pregunta más, ¿por qué estamos pasando esta función de mapa a continuación como .toString().

            map: function(doc) {
            if(doc.firstname=="Chandan\" ) {
            emit(doc._id, {nombre: doc.nombre, apellido: doc.apellido, email: doc.emailrev: doc._rev})
            }
            }.toString()

            debido a esto cuando intento hacer
            var username=\"chandan\";

            if(doc.firstname == nombredeusuario ) {
            emit(doc._id, {nombre: doc.nombre, apellido: doc.apellido, email: doc.emailrev: doc._rev})
            }
            }.toString() no recupera mis datos.

          2. Es posible que desee leer esto para construir su comprensión de MapReduce Views:

            http://docs.couchbase.com/admi

            Lo mejor,

  16. Hola Nic, soy novato con Couchbase, seguí tu tutorial pero al ejecutarlo en dispositivo el log muestra el error 412 :
    No se ha podido cargar el recurso: el servidor ha respondido con el estado 412 (Precondición fallida) http://b24781df-87c6-4f08-a5a0-79a98c045265:174400da-d82c-48b4-bd70-05587e0e2fd2@localhost:598
    Se que necesito crear la base de datos de todo en el servidor couchbase, pero no se como conseguir la url y el plugin para el codigo. ¿Puedes ayudarme con esto? Gracias

    1. ¿Has mirado el post 2 de la serie? En ese me centro en la sincronización. Post 1 es sólo cosas locales.

  17. He construido la aplicación para la plataforma Android, pero la aplicación está en blanco. Incluso he descargado todo el código y construido la aplicación para la plataforma Android, pero la aplicación sólo muestra el botón de inicio de sesión de invitados y haciendo clic en él no hace nada.

    1. ¿Qué dicen sus registros?

      1. No sé cómo ver los registros, instalé la aplicación en un dispositivo físico, no en un emulador.

      2. \TypeError: No se puede llamar al método 'queryView\' de null

      3. \TypeError: No se puede llamar al método 'queryView\' de null

  18. Siento poner un nuevo comentario, pero creo que la respuesta no se estaba publicando.
    El registro dice: \TypeError: No se puede llamar al método 'queryView\' de null

    1. Significa que todoDatabase no se ha establecido. ¿Puede comprobar en el método de ejecución para asegurarse de que se está configurando? Me refiero a comprobar mediante la adición de algunas salidas de la consola.

      1. Sí, lo tengo funcionando, gracias por la ayuda.

  19. [...] año escribí sobre el uso de Couchbase Mobile en una aplicación móvil de Ionic Framework. Por aquel entonces usábamos Ionic Framework 1.0 y AngularJS 1.0. La tecnología ha cambiado a lo largo del [...]

  20. [...] Escribí sobre cómo usar Couchbase en una aplicación móvil Android e iOS de Ionic Framework, pero hacía uso de Couchbase Lite como base de datos NoSQL embebida. Esta vez vamos a [...]

Dejar una respuesta