Introducción
Zebra Technologies™ es líder mundial en impresión de códigos de barras, informática móvil, captura de datos y capacidades relacionadas. Zebra ofrece una línea completa de ordenadores de mano robustos con escáneres de códigos de barras integrados. Estos dispositivos basados en Android tienen una amplia gama de aplicaciones, incluyendo el seguimiento de la entrega, la venta asistida, y la gestión de activos, por nombrar algunos.
Muchas de estas aplicaciones encajan perfectamente con el Couchbase Móvil que suministra la plataforma de datos de respaldo. Dado que Couchbase Lite es una verdadera base de datos NoSQL de pleno derecho, tienes el rendimiento de los datos en el dispositivo combinado con una fácil sincronización fuera del dispositivo.
Para demostrar un caso de uso, hemos creado una aplicación de escaneado de inventario de muestra.

Captura de pantalla
Los datos consisten en información sobre un conjunto ficticio de libros. El escaneado de los códigos de barras ISBN extrae la información del Couchbase Lite base de datos integrada. Se basa en la Zebra DataWedge servicio de lectura de códigos de barras ISBN.
La aplicación completa, junto con datos de muestra, está disponible en GitHub aquí. Este post examinará el código. Para ver la demo en acción y obtener más información sobre Zebra y Couchbase, vea este seminario web de Zebra DEVTALK.
Visión general
La aplicación consiste en una única Actividad. Couchbase Lite se integra como una librería en el proyecto. La aplicación se instala sin ningún dato. Almacenamos los datos de inventario en Couchbase Server. Los datos del dispositivo se rellenarán en tiempo de ejecución utilizando una replicación bidireccional.
DataWedge se ejecuta como un componente independiente en el dispositivo. La API se basa completamente en Intents. Activamos el escaneo emitiendo una intención, y los datos vuelven a través de una. Para ello, asocias un perfil DataWedge a tu aplicación. (De este modo, DataWedge puede, entre otras cosas, dirigirse específicamente a la aplicación cuando devuelve un resultado).
El código (aparte del trabajo de interfaz de usuario) consiste en configurar la base de datos, iniciar una replicación y añadir un botón de activación de escaneado. Cuando se obtiene el resultado del escaneo (recordemos que se trata de un ISBN), la aplicación consulta la base de datos para obtener los detalles del libro y los muestra. (Como nota al margen, utilizamos RxJava para manejar multi-threading).
El perfil DataWedge de Zebra
DataWedge hace un uso elegante del sistema Android Intent. Para ello es necesario configurar un perfil. Estas capturas de pantalla muestran las opciones utilizadas aquí.

Activar la exploración

Habilitar intenciones
Fíjese en particular en el ajuste "Intent action". Necesitaremos la misma cadena en la propia aplicación.
Inicialización de la base de datos e inicio de la replicación
Para que la aplicación sea compacta, inicializamos la base de datos en el directorio onCreate
en el método EscanearActividad
clase. También configuramos allí la replicación.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// com/couchbase/mobile/zebra/ScanActivity.java pruebe { Configuración de la base de datos config = nuevo Configuración de la base de datos(getApplicationContext()); base de datos = nuevo Base de datos("inventario", config); Punto final targetEndpoint = nuevo URLEndpoint(nuevo URI("ws://localhost:4984/inventario")); ReplicatorConfiguration repConfig = nuevo ReplicatorConfiguration(base de datos, targetEndpoint) .setReplicatorType(ReplicatorConfiguration.ReplicatorType.PUSH_AND_PULL) .setAuthenticator(nuevo BasicAuthenticator("usuario", "contraseña")) .setContinuous(verdadero); Replicador replicador = nuevo Replicador(repConfig); replicador.iniciar(); } captura(CouchbaseLiteException | URISyntaxException ex) { ex.printStackTrace(); } |
Todo esto es muy sencillo. El punto final es la dirección de nuestra instancia de Sync Gateway. Establecer la replicación en continuo
hace que Couchbase actualice constantemente la base de datos en segundo plano.
Botón de exploración suave
Los dispositivos Zebra disponen de hardware dedicado para activar el escaneado. Hemos añadido un botón en la interfaz de usuario para hacerlo también. La llamada de retorno para los clics del botón muestra cómo utilizar la API basada en la intención de DataWedge. Sólo tienes que rellenar la intención con algunas cadenas clave, y dejar que Android se encargue del resto.
1 2 3 4 5 6 |
softScanButton.setOnClickListener(ver -> { Intención intento = nuevo Intención(); intento.setAction(DATAWEDGE_ACTION); intento.putExtra(DATAWEDGE_SOFT_SCAN_TRIGGER, DATAWEDGE_TOGGLE_SCANNING); sendBroadcast(intento); }); |
Recepción de los resultados de la exploración
Una vez activado, el escáner se ilumina y captura los datos en segundo plano. Si tiene éxito, se devuelve la información del código de barras, también mediante una intent.
Configuramos DataWedge para entregar la intención utilizando startActivity
. Aquí es donde el Acción intencionada
del perfil. Establecemos un filtro de intención en nuestro manifiesto de Android para que coincida con la cadena de ese ajuste.
Por defecto, esto crearía normalmente una nueva instancia de la actividad correspondiente. En este caso, sólo queremos mantener la misma actividad y dejar que procese el resultado. Para ello, establecemos el modo de lanzamiento de la actividad en singleTop
.
Esto significa que la intención se entregará a través del onNewIntent
método. Esto no afecta a la intención original que inició la actividad en primer lugar. Utilizamos un patrón común para restablecer la intención de la actividad a la nueva en onNewIntent
y luego procesarlo en onResume
.
Configuración de la consulta
En onResume
comprobamos que la intención coincide con lo que esperábamos. A continuación, extraemos el número ISBN y realizamos la consulta.
Couchbase Lite utiliza una interfaz de estilo constructor para crear consultas. La API está diseñada para mapear directamente una sentencia SQL. Aquí, el equivalente SQL sería SELECT * FROM inventario WHERE isbn = "";
donde <scan result>
representa la cadena que se nos devuelve.
Eso se traduce en este código.
1 2 3 4 5 6 7 8 |
Cadena isbn = intento.getStringExtra(DATAWEDGE_INTENT_DATA); ... Consulta consulta = Constructor de consultas .seleccione(SeleccionarResultado.todos()) .de(Fuente de datos.base de datos(base de datos)) .donde(Expresión.propiedad("isbn").equalTo(Expresión.cadena(isbn))); |
Esta capacidad de consulta dinámica se añadió en Couchbase Lite 2.0. Se basa en el lenguaje de consulta N1QL de Couchbase, que es un superconjunto de SQL. Para una introducción más profunda a las consultas en Couchbase Lite, recomiendo leer esta entrada del blog.
Ejecución de consultas y resultados
Con el objeto de consulta en la mano, lo ejecutamos y recuperamos los resultados en forma de lista. Esperamos que cada ISBN corresponda a un único libro. Si el resultado es correcto, mostramos una miniatura de la cubierta del libro y otra información. Si falta el libro u obtenemos más de un resultado, mostramos un error en lugar de la portada del libro. Este código está envuelto usando RxJava para que la consulta se ejecute en un hilo en segundo plano.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
pruebe { resultados = consulta.ejecutar().todosResultados(); } captura(CouchbaseLiteException ex) { fuente.onError((ex)); } si (0 == resultados.talla()) { información = advertencia("Desaparecido"); } si no si (1 < resultados.talla()) { información = advertencia("Duplicado"); } si no { Diccionario resultado = resultados.consiga(0).getDictionary(base de datos.getName()); información = resultado.toMap(); InputStream es = resultado.getBlob("portada").getContentStream(); Mapa de bits miniatura = BitmapFactory.decodeStream(es); información.poner("miniatura", miniatura); } |
Recuperamos todo el contenido del documento como un objeto Diccionario. (Los diccionarios son estructuras de datos inmutables con semántica map definida por Couchbase Lite). Necesitamos convertir la imagen de la portada del libro, adjunta como un blob, en un bitmap. Por comodidad, convertimos el diccionario en un mapa, creamos el mapa de bits y lo añadimos al mapa. Esto se pasa al código de la interfaz de usuario.
Conclusión
El repositorio de GitHub para este proyecto tiene todos los extras necesarios para ejecutarlo. Hay un archivo de configuración de Sync Gateway, configurado para hablar con una instancia local de Couchbase Server. También puedes encontrar un PDF con algunos ejemplos de códigos de barras.
Para obtener más información sobre la integración del escaneado de códigos de barras en su aplicación, visite https://developer.zebra.com.
Posdata
Couchbase es de código abierto y probar gratis.
Empezar con código de ejemplo, consultas de ejemplo, tutoriales y mucho más.
Más recursos en nuestra portal para desarrolladores.
Síguenos en Twitter @CouchbaseDev.
Puede enviar preguntas a nuestro foros.
Participamos activamente en Stack Overflow.
Envíame tus preguntas, comentarios, temas que te gustaría ver, etc. a Twitter. @HodGreeley