{"id":5894,"date":"2018-10-12T13:16:47","date_gmt":"2018-10-12T20:16:47","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=5894"},"modified":"2025-06-13T20:52:35","modified_gmt":"2025-06-14T03:52:35","slug":"offline-barcode-scanning-zebra-datawedge-couchbase-mobile","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/offline-barcode-scanning-zebra-datawedge-couchbase-mobile\/","title":{"rendered":"Escaneado de inventario sin conexi\u00f3n con Zebra DataWedge y Couchbase Mobile"},"content":{"rendered":"<div id=\"preamble\">\n<div class=\"sectionbody\">\n<div style=\"margin: 0 auto\">\n<div class=\"mceTemp\"><\/div>\n<\/div>\n<div style=\"clear: both\"><\/div>\n<p><span class=\"image\"><a class=\"image\" title=\"https:\/\/www.couchbase.com\/downloads\" href=\"https:\/\/www.couchbase.com\/blog\/es\/downloads\/\"><img decoding=\"async\" src=\"https:\/\/img.shields.io\/badge\/Couchbase%20Server-v5.5-red.svg\" alt=\"Couchbase%20Server v5.5 red\" \/><\/a><\/span>\u00a0<span class=\"image\"><a class=\"image\" title=\"https:\/\/www.couchbase.com\/downloads\" href=\"https:\/\/www.couchbase.com\/blog\/es\/downloads\/\"><img decoding=\"async\" src=\"https:\/\/img.shields.io\/badge\/Sync%20Gateway-v2.1-red.svg\" alt=\"Sync%20Gateway v2.1 red\" \/><\/a><\/span>\u00a0<span class=\"image\"><a class=\"image\" title=\"https:\/\/www.couchbase.com\/downloads\" href=\"https:\/\/www.couchbase.com\/blog\/es\/downloads\/\"><img decoding=\"async\" src=\"https:\/\/img.shields.io\/badge\/Couchbase%20Lite-v2.1-red.svg\" alt=\"Couchbase%20Lite v2.1 red\" \/><\/a><\/span><\/p>\n<\/div>\n<h2 id=\"_introduction\" class=\"discrete\">Introducci\u00f3n<\/h2>\n<div class=\"paragraph\">\n<p><a title=\"https:\/\/www.zebra.com\/us\/en.html\" href=\"https:\/\/www.zebra.com\/us\/en.html\">Zebra Technologies<\/a>\u2122 es l\u00edder mundial en impresi\u00f3n de c\u00f3digos de barras, inform\u00e1tica m\u00f3vil, captura de datos y capacidades relacionadas. Zebra ofrece una l\u00ednea completa de ordenadores de mano robustos con esc\u00e1neres de c\u00f3digos 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\u00f3n de activos, por nombrar algunos.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Muchas de estas aplicaciones encajan perfectamente con el\u00a0<a title=\"https:\/\/www.couchbase.com\/developers\/mobile\/\" href=\"https:\/\/developer.couchbase.com\/mobile\">Couchbase M\u00f3vil<\/a>\u00a0que 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\u00e1cil sincronizaci\u00f3n fuera del dispositivo.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Para demostrar un caso de uso, hemos creado una aplicaci\u00f3n de escaneado de inventario de muestra.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<div style=\"margin: 0 auto\">\n<div style=\"width: 210px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" style=\"margin: 0 auto\" src=\"https:\/\/raw.githubusercontent.com\/couchbaselabs\/blog-source-code\/master\/Greeley\/0051ZebraInventory\/images\/application.png\" alt=\"Screenshot\" width=\"200\" height=\"1280\" \/><p class=\"wp-caption-text\">Captura de pantalla<\/p><\/div>\n<\/div>\n<div style=\"clear: both\"><\/div>\n<p>Los datos consisten en informaci\u00f3n sobre un conjunto ficticio de libros. El escaneado de los c\u00f3digos de barras ISBN extrae la informaci\u00f3n del\u00a0<a title=\"https:\/\/www.couchbase.com\/products\/lite\" href=\"https:\/\/www.couchbase.com\/blog\/es\/products\/lite\/\">Couchbase Lite<\/a>\u00a0base de datos integrada. Se basa en la\u00a0<a title=\"https:\/\/www.zebra.com\/us\/en\/products\/software\/mobile-computers\/datawedge.html\" href=\"https:\/\/www.zebra.com\/us\/en\/products\/software\/mobile-computers\/datawedge.html\">Zebra DataWedge<\/a>\u00a0servicio de lectura de c\u00f3digos de barras ISBN.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>La aplicaci\u00f3n completa, junto con datos de muestra, est\u00e1 disponible en GitHub\u00a0<a title=\"https:\/\/github.com\/HodGreeley\/Zebra-Inventory\" href=\"https:\/\/github.com\/HodGreeley\/Zebra-Inventory\">aqu\u00ed<\/a>. Este post examinar\u00e1 el c\u00f3digo. Para ver la demo en acci\u00f3n y obtener m\u00e1s informaci\u00f3n sobre Zebra y Couchbase, vea este seminario web de Zebra DEVTALK.<\/p>\n<\/div>\n<div class=\"videoblock\">\n<div class=\"content\"><\/div>\n<\/div>\n<div id=\"toc\" class=\"toc\">\n<div id=\"toctitle\" class=\"title\">Contenido<\/div>\n<ul class=\"sectlevel1\">\n<li><a title=\"file:\/\/\/Applications\/Visual%20Studio%20Code.app\/Contents\/Resources\/app\/out\/vs\/workbench\/parts\/webview\/electron-browser\/webview.html#_overview\" href=\"#_overview\">Visi\u00f3n general<\/a><\/li>\n<li><a title=\"file:\/\/\/Applications\/Visual%20Studio%20Code.app\/Contents\/Resources\/app\/out\/vs\/workbench\/parts\/webview\/electron-browser\/webview.html#_the_zebra_datawedge_profile\" href=\"#_the_zebra_datawedge_profile\">El perfil DataWedge de Zebra<\/a><\/li>\n<li><a title=\"file:\/\/\/Applications\/Visual%20Studio%20Code.app\/Contents\/Resources\/app\/out\/vs\/workbench\/parts\/webview\/electron-browser\/webview.html#_initializing_the_database_and_starting_replication\" href=\"#_initializing_the_database_and_starting_replication\">Inicializaci\u00f3n de la base de datos e inicio de la replicaci\u00f3n<\/a><\/li>\n<li><a title=\"file:\/\/\/Applications\/Visual%20Studio%20Code.app\/Contents\/Resources\/app\/out\/vs\/workbench\/parts\/webview\/electron-browser\/webview.html#_soft_scan_button\" href=\"#_soft_scan_button\">Bot\u00f3n de exploraci\u00f3n suave<\/a><\/li>\n<li><a title=\"file:\/\/\/Applications\/Visual%20Studio%20Code.app\/Contents\/Resources\/app\/out\/vs\/workbench\/parts\/webview\/electron-browser\/webview.html#_receiving_scan_results\" href=\"#_receiving_scan_results\">Recepci\u00f3n de los resultados de la exploraci\u00f3n<\/a><\/li>\n<li><a title=\"file:\/\/\/Applications\/Visual%20Studio%20Code.app\/Contents\/Resources\/app\/out\/vs\/workbench\/parts\/webview\/electron-browser\/webview.html#_setting_up_the_query\" href=\"#_setting_up_the_query\">Configuraci\u00f3n de la consulta<\/a><\/li>\n<li><a title=\"file:\/\/\/Applications\/Visual%20Studio%20Code.app\/Contents\/Resources\/app\/out\/vs\/workbench\/parts\/webview\/electron-browser\/webview.html#_query_execution_and_results\" href=\"#_query_execution_and_results\">Ejecuci\u00f3n de consultas y resultados<\/a><\/li>\n<li><a title=\"file:\/\/\/Applications\/Visual%20Studio%20Code.app\/Contents\/Resources\/app\/out\/vs\/workbench\/parts\/webview\/electron-browser\/webview.html#_wrapping_up\" href=\"#_wrapping_up\">Conclusi\u00f3n<\/a><\/li>\n<li><a title=\"file:\/\/\/Applications\/Visual%20Studio%20Code.app\/Contents\/Resources\/app\/out\/vs\/workbench\/parts\/webview\/electron-browser\/webview.html#_postscript\" href=\"#_postscript\">Posdata<\/a><\/li>\n<\/ul>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_overview\">Visi\u00f3n general<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>La aplicaci\u00f3n consiste en una \u00fanica Actividad. Couchbase Lite se integra como una librer\u00eda en el proyecto. La aplicaci\u00f3n se instala sin ning\u00fan dato. Almacenamos los datos de inventario en Couchbase Server. Los datos del dispositivo se rellenar\u00e1n en tiempo de ejecuci\u00f3n utilizando una replicaci\u00f3n bidireccional.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>DataWedge se ejecuta como un componente independiente en el dispositivo. La API se basa completamente en Intents. Activamos el escaneo emitiendo una intenci\u00f3n, y los datos vuelven a trav\u00e9s de una. Para ello, asocias un perfil DataWedge a tu aplicaci\u00f3n. (De este modo, DataWedge puede, entre otras cosas, dirigirse espec\u00edficamente a la aplicaci\u00f3n cuando devuelve un resultado).<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>El c\u00f3digo (aparte del trabajo de interfaz de usuario) consiste en configurar la base de datos, iniciar una replicaci\u00f3n y a\u00f1adir un bot\u00f3n de activaci\u00f3n de escaneado. Cuando se obtiene el resultado del escaneo (recordemos que se trata de un ISBN), la aplicaci\u00f3n consulta la base de datos para obtener los detalles del libro y los muestra. (Como nota al margen, utilizamos RxJava para manejar multi-threading).<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_the_zebra_datawedge_profile\">El perfil DataWedge de Zebra<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>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\u00ed.<\/p>\n<\/div>\n<div class=\"openblock float-group\">\n<div class=\"content\">\n<div class=\"imageblock\">\n<div class=\"content\">\n<div style=\"float: left;margin-right: 5px\">\n<div style=\"width: 210px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/raw.githubusercontent.com\/couchbaselabs\/blog-source-code\/master\/Greeley\/0051ZebraInventory\/images\/profile_1.png\" alt=\"Enable Scanning\" width=\"200\" height=\"1280\" \/><p class=\"wp-caption-text\">Activar la exploraci\u00f3n<\/p><\/div>\n<\/div>\n<div style=\"float: left;margin-right: 5px\">\n<div style=\"width: 210px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/raw.githubusercontent.com\/couchbaselabs\/blog-source-code\/master\/Greeley\/0051ZebraInventory\/images\/profile_2.png\" alt=\"Enable Intents\" width=\"200\" height=\"1280\" \/><p class=\"wp-caption-text\">Habilitar intenciones<\/p><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div style=\"clear: both\"><\/div>\n<div class=\"paragraph\">\n<p>F\u00edjese en particular en el ajuste \"Intent action\". Necesitaremos la misma cadena en la propia aplicaci\u00f3n.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_initializing_the_database_and_starting_replication\">Inicializaci\u00f3n de la base de datos e inicio de la replicaci\u00f3n<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Para que la aplicaci\u00f3n sea compacta, inicializamos la base de datos en el directorio\u00a0<code>onCreate<\/code>\u00a0en el m\u00e9todo\u00a0<code>EscanearActividad<\/code>\u00a0clase. Tambi\u00e9n configuramos all\u00ed la replicaci\u00f3n.<\/p>\n<pre class=\"theme:tomorrow-night lang:java decode:true\">\/\/ com\/couchbase\/mobile\/zebra\/ScanActivity.java\r\n\r\ntry {\r\n    DatabaseConfiguration config = new DatabaseConfiguration(getApplicationContext());\r\n    database = nueva Database(\"inventario\", config);\r\n\r\n    Endpoint targetEndpoint = new URLEndpoint(new URI(\"ws:\/\/localhost:4984\/inventory\"));\r\n    ReplicatorConfiguration repConfig = new ReplicatorConfiguration(base de datos, targetEndpoint)\r\n            .setReplicatorType(ReplicatorConfiguration.ReplicatorType.PUSH_AND_PULL)\r\n            .setAuthenticator(new BasicAuthenticator(\"usuario\", \"contrase\u00f1a\"))\r\n            .setContinuous(true);\r\n    Replicator replicator = new Replicator(repConfig);\r\n    replicator.start();\r\n} catch(CouchbaseLiteException | URISyntaxException ex) {\r\n    ex.printStackTrace();\r\n}<\/pre>\n<\/div>\n<div class=\"paragraph\">\n<p>Todo esto es muy sencillo. El punto final es la direcci\u00f3n de nuestra instancia de Sync Gateway. Establecer la replicaci\u00f3n en\u00a0<code>continuo<\/code>\u00a0hace que Couchbase actualice constantemente la base de datos en segundo plano.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_soft_scan_button\">Bot\u00f3n de exploraci\u00f3n suave<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Los dispositivos Zebra disponen de hardware dedicado para activar el escaneado. Hemos a\u00f1adido un bot\u00f3n en la interfaz de usuario para hacerlo tambi\u00e9n. La llamada de retorno para los clics del bot\u00f3n muestra c\u00f3mo utilizar la API basada en la intenci\u00f3n de DataWedge. S\u00f3lo tienes que rellenar la intenci\u00f3n con algunas cadenas clave, y dejar que Android se encargue del resto.<\/p>\n<pre class=\"theme:tomorrow-night lang:java decode:true\">softScanButton.setOnClickListener(vista -&gt; {\r\n    Intent intent = new Intent();\r\n    intent.setAction(DATAWEDGE_ACTION);\r\n    intent.putExtra(DATAWEDGE_SOFT_SCAN_TRIGGER, DATAWEDGE_TOGGLE_SCANNING);\r\n    sendBroadcast(intent);\r\n});<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_receiving_scan_results\">Recepci\u00f3n de los resultados de la exploraci\u00f3n<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Una vez activado, el esc\u00e1ner se ilumina y captura los datos en segundo plano. Si tiene \u00e9xito, se devuelve la informaci\u00f3n del c\u00f3digo de barras, tambi\u00e9n mediante una intent.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Configuramos DataWedge para entregar la intenci\u00f3n utilizando\u00a0<code>startActivity<\/code>. Aqu\u00ed es donde el\u00a0<code>Acci\u00f3n intencionada<\/code>\u00a0del perfil. Establecemos un filtro de intenci\u00f3n en nuestro manifiesto de Android para que coincida con la cadena de ese ajuste.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Por defecto, esto crear\u00eda normalmente una nueva instancia de la actividad correspondiente. En este caso, s\u00f3lo queremos mantener la misma actividad y dejar que procese el resultado. Para ello, establecemos el modo de lanzamiento de la actividad en\u00a0<code>singleTop<\/code>.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Esto significa que la intenci\u00f3n se entregar\u00e1 a trav\u00e9s del\u00a0<code>onNewIntent<\/code>\u00a0m\u00e9todo. Esto no afecta a la intenci\u00f3n original que inici\u00f3 la actividad en primer lugar. Utilizamos un patr\u00f3n com\u00fan para restablecer la intenci\u00f3n de la actividad a la nueva en\u00a0<code>onNewIntent<\/code>y luego procesarlo en\u00a0<code>onResume<\/code>.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_setting_up_the_query\">Configuraci\u00f3n de la consulta<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>En\u00a0<code>onResume<\/code>comprobamos que la intenci\u00f3n coincide con lo que esper\u00e1bamos. A continuaci\u00f3n, extraemos el n\u00famero ISBN y realizamos la consulta.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Couchbase Lite utiliza una interfaz de estilo constructor para crear consultas. La API est\u00e1 dise\u00f1ada para mapear directamente una sentencia SQL. Aqu\u00ed, el equivalente SQL ser\u00eda\u00a0<code>SELECT * FROM inventario WHERE isbn = \"\";<\/code>donde\u00a0<code>&lt;scan result&gt;<\/code>representa la cadena que se nos devuelve.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Eso se traduce en este c\u00f3digo.<\/p>\n<pre class=\"theme:tomorrow-night lang:java decode:true\">String isbn = intent.getStringExtra(DATAWEDGE_INTENT_DATA);\r\n\r\n...\r\n\r\nConsulta query = QueryBuilder\r\n        .select(SelectResult.all())\r\n        .from(DataSource.database(base de datos))\r\n        .where(Expression.property(\"isbn\").equalTo(Expression.string(isbn)));<\/pre>\n<\/div>\n<div class=\"paragraph\">\n<p>Esta capacidad de consulta din\u00e1mica se a\u00f1adi\u00f3 en Couchbase Lite 2.0. Se basa en el lenguaje de consulta N1QL de Couchbase, que es un superconjunto de SQL. Para una introducci\u00f3n m\u00e1s profunda a las consultas en Couchbase Lite, recomiendo leer\u00a0<a title=\"https:\/\/www.couchbase.com\/blog\/sql-for-json-query-interface-couchbase-mobile\/\" href=\"https:\/\/www.couchbase.com\/blog\/es\/sql-for-json-query-interface-couchbase-mobile\/\">esta entrada del blog<\/a>.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_query_execution_and_results\">Ejecuci\u00f3n de consultas y resultados<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>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 \u00fanico libro. Si el resultado es correcto, mostramos una miniatura de la cubierta del libro y otra informaci\u00f3n. Si falta el libro u obtenemos m\u00e1s de un resultado, mostramos un error en lugar de la portada del libro. Este c\u00f3digo est\u00e1 envuelto usando RxJava para que la consulta se ejecute en un hilo en segundo plano.<\/p>\n<pre class=\"theme:tomorrow-night lang:java decode:true\">try {\r\n    results = query.execute().allResults();\r\n} catch(CouchbaseLiteException ex) {\r\n    source.onError((ex));\r\n}\r\n\r\nif (0 == results.size()) {\r\n    info = warning(\"Falta\");\r\n} else if (1 &lt; results.size()) {\r\n    info = warning(&quot;Duplicado&quot;);\r\n} else {\r\n    Dictionary result = results.get(0).getDictionary(database.getName());\r\n    info = resultado.toMap();\r\n\r\n    InputStream is = result.getBlob(&quot;portada&quot;).getContentStream();\r\n    Bitmap thumbnail = BitmapFactory.decodeStream(is);\r\n    info.put(&quot;miniatura&quot;, miniatura);\r\n}<\/pre>\n<\/div>\n<div class=\"paragraph\">\n<p>Recuperamos todo el contenido del documento como un objeto Diccionario. (Los diccionarios son estructuras de datos inmutables con sem\u00e1ntica 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\u00f1adimos al mapa. Esto se pasa al c\u00f3digo de la interfaz de usuario.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_wrapping_up\">Conclusi\u00f3n<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>El repositorio de GitHub para este proyecto tiene todos los extras necesarios para ejecutarlo. Hay un archivo de configuraci\u00f3n de Sync Gateway, configurado para hablar con una instancia local de Couchbase Server. Tambi\u00e9n puedes encontrar un PDF con algunos ejemplos de c\u00f3digos de barras.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Para obtener m\u00e1s informaci\u00f3n sobre la integraci\u00f3n del escaneado de c\u00f3digos de barras en su aplicaci\u00f3n, visite\u00a0<a class=\"bare\" title=\"https:\/\/developer.zebra.com\/\" href=\"https:\/\/developer.zebra.com\">https:\/\/developer.zebra.com<\/a>.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_postscript\">Posdata<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Couchbase es de c\u00f3digo abierto y\u00a0<a title=\"https:\/\/www.couchbase.com\/downloads\" href=\"https:\/\/www.couchbase.com\/blog\/es\/downloads\/\">probar gratis<\/a>.<br \/>\n<strong>Empezar<\/strong>\u00a0con\u00a0<a title=\"https:\/\/www.couchbase.com\/get-started\" href=\"https:\/\/developer.couchbase.com\/tutorials\">c\u00f3digo de ejemplo, consultas de ejemplo, tutoriales y mucho m\u00e1s<\/a>.<br \/>\nM\u00e1s recursos en nuestra\u00a0<a title=\"https:\/\/developer.couchbase.com\/community\" href=\"https:\/\/www.couchbase.com\/blog\/es\/developers\/community\/\">portal para desarrolladores<\/a>.<br \/>\nS\u00edguenos en Twitter\u00a0<a title=\"https:\/\/twitter.com\/CouchbaseDev\" href=\"https:\/\/twitter.com\/CouchbaseDev\">@CouchbaseDev<\/a>.<br \/>\nPuede enviar preguntas a nuestro\u00a0<a title=\"https:\/\/www.couchbase.com\/forums\/\" href=\"https:\/\/www.couchbase.com\/blog\/es\/forums\/\">foros<\/a>.<br \/>\nParticipamos activamente en\u00a0<a title=\"https:\/\/stackoverflow.com\/questions\/tagged\/couchbase\" href=\"https:\/\/stackoverflow.com\/questions\/tagged\/couchbase\">Stack Overflow<\/a>.<br \/>\nEnv\u00edame tus preguntas, comentarios, temas que te gustar\u00eda ver, etc. a Twitter.\u00a0<a title=\"https:\/\/twitter.com\/HodGreeley\" href=\"https:\/\/twitter.com\/HodGreeley\">@HodGreeley<\/a><\/p>\n<\/div>\n<\/div>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>\u00a0\u00a0 Introduction Zebra Technologies\u2122 is a global leader in barcode printing, mobile computing, data capture, and related capabilities. Zebra offers a complete line of ruggedized handheld computers with built-in bar code scanners. These Android-based devices have a wide range of [&hellip;]<\/p>","protected":false},"author":73,"featured_media":5895,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[2370,1815,7667,1810,1812,2366],"tags":[],"ppma_author":[9042],"class_list":["post-5894","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-android","category-best-practices-and-tutorials","category-couchbase-lite","category-couchbase-mobile","category-n1ql-query","category-sync-gateway"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.8 (Yoast SEO v25.8) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>The Zebra DataWedge Profile - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"Android Mobile tutorial showing offline barcode scanning synced to a backing database using Zebra DataWedge and Couchbase Mobile.\" \/>\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\/offline-barcode-scanning-zebra-datawedge-couchbase-mobile\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Offline Inventory Scanning with Zebra DataWedge and Couchbase Mobile\" \/>\n<meta property=\"og:description\" content=\"Android Mobile tutorial showing offline barcode scanning synced to a backing database using Zebra DataWedge and Couchbase Mobile.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/offline-barcode-scanning-zebra-datawedge-couchbase-mobile\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2018-10-12T20:16:47+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T03:52:35+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/hero.png\" \/>\n\t<meta property=\"og:image:width\" content=\"670\" \/>\n\t<meta property=\"og:image:height\" content=\"404\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Hod Greeley, Developer Advocate, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@HodGreeley\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Hod Greeley, Developer Advocate, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/offline-barcode-scanning-zebra-datawedge-couchbase-mobile\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/offline-barcode-scanning-zebra-datawedge-couchbase-mobile\/\"},\"author\":{\"name\":\"Hod Greeley, Developer Advocate, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/9b62593c8a13531e53d52fcd5aabbca4\"},\"headline\":\"Offline Inventory Scanning with Zebra DataWedge and Couchbase Mobile\",\"datePublished\":\"2018-10-12T20:16:47+00:00\",\"dateModified\":\"2025-06-14T03:52:35+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/offline-barcode-scanning-zebra-datawedge-couchbase-mobile\/\"},\"wordCount\":1057,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/offline-barcode-scanning-zebra-datawedge-couchbase-mobile\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/hero.png\",\"articleSection\":[\"Android\",\"Best Practices and Tutorials\",\"Couchbase Lite\",\"Couchbase Mobile\",\"SQL++ \/ N1QL Query\",\"Sync Gateway\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/offline-barcode-scanning-zebra-datawedge-couchbase-mobile\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/offline-barcode-scanning-zebra-datawedge-couchbase-mobile\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/offline-barcode-scanning-zebra-datawedge-couchbase-mobile\/\",\"name\":\"The Zebra DataWedge Profile - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/offline-barcode-scanning-zebra-datawedge-couchbase-mobile\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/offline-barcode-scanning-zebra-datawedge-couchbase-mobile\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/hero.png\",\"datePublished\":\"2018-10-12T20:16:47+00:00\",\"dateModified\":\"2025-06-14T03:52:35+00:00\",\"description\":\"Android Mobile tutorial showing offline barcode scanning synced to a backing database using Zebra DataWedge and Couchbase Mobile.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/offline-barcode-scanning-zebra-datawedge-couchbase-mobile\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/offline-barcode-scanning-zebra-datawedge-couchbase-mobile\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/offline-barcode-scanning-zebra-datawedge-couchbase-mobile\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/hero.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/hero.png\",\"width\":670,\"height\":404},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/offline-barcode-scanning-zebra-datawedge-couchbase-mobile\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Offline Inventory Scanning with Zebra DataWedge and Couchbase Mobile\"}]},{\"@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\/9b62593c8a13531e53d52fcd5aabbca4\",\"name\":\"Hod Greeley, Developer Advocate, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/21eb69cb5d4a401fb23b149e4f4e9e87\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g\",\"caption\":\"Hod Greeley, Developer Advocate, Couchbase\"},\"description\":\"Hod Greeley is a Developer Advocate for Couchbase, living in Silicon Valley. He has over two decades of experience as a software engineer and engineering manager. He has worked in a variety of software fields, including computational physics and chemistry, computer and network security, finance, and mobile. Prior to joining Couchbase in 2016, Hod led developer relations for mobile at Samsung. Hod holds a Ph.D. in chemical physics from Columbia University.\",\"sameAs\":[\"https:\/\/hod.greeley.org\/blog\",\"https:\/\/x.com\/HodGreeley\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/hod-greeley\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"The Zebra DataWedge Profile - The Couchbase Blog","description":"Android Mobile tutorial showing offline barcode scanning synced to a backing database using Zebra DataWedge and Couchbase Mobile.","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\/offline-barcode-scanning-zebra-datawedge-couchbase-mobile\/","og_locale":"es_MX","og_type":"article","og_title":"Offline Inventory Scanning with Zebra DataWedge and Couchbase Mobile","og_description":"Android Mobile tutorial showing offline barcode scanning synced to a backing database using Zebra DataWedge and Couchbase Mobile.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/offline-barcode-scanning-zebra-datawedge-couchbase-mobile\/","og_site_name":"The Couchbase Blog","article_published_time":"2018-10-12T20:16:47+00:00","article_modified_time":"2025-06-14T03:52:35+00:00","og_image":[{"width":670,"height":404,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/hero.png","type":"image\/png"}],"author":"Hod Greeley, Developer Advocate, Couchbase","twitter_card":"summary_large_image","twitter_creator":"@HodGreeley","twitter_misc":{"Written by":"Hod Greeley, Developer Advocate, Couchbase","Est. reading time":"6 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/offline-barcode-scanning-zebra-datawedge-couchbase-mobile\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/offline-barcode-scanning-zebra-datawedge-couchbase-mobile\/"},"author":{"name":"Hod Greeley, Developer Advocate, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/9b62593c8a13531e53d52fcd5aabbca4"},"headline":"Offline Inventory Scanning with Zebra DataWedge and Couchbase Mobile","datePublished":"2018-10-12T20:16:47+00:00","dateModified":"2025-06-14T03:52:35+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/offline-barcode-scanning-zebra-datawedge-couchbase-mobile\/"},"wordCount":1057,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/offline-barcode-scanning-zebra-datawedge-couchbase-mobile\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/hero.png","articleSection":["Android","Best Practices and Tutorials","Couchbase Lite","Couchbase Mobile","SQL++ \/ N1QL Query","Sync Gateway"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/offline-barcode-scanning-zebra-datawedge-couchbase-mobile\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/offline-barcode-scanning-zebra-datawedge-couchbase-mobile\/","url":"https:\/\/www.couchbase.com\/blog\/offline-barcode-scanning-zebra-datawedge-couchbase-mobile\/","name":"The Zebra DataWedge Profile - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/offline-barcode-scanning-zebra-datawedge-couchbase-mobile\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/offline-barcode-scanning-zebra-datawedge-couchbase-mobile\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/hero.png","datePublished":"2018-10-12T20:16:47+00:00","dateModified":"2025-06-14T03:52:35+00:00","description":"Android Mobile tutorial showing offline barcode scanning synced to a backing database using Zebra DataWedge and Couchbase Mobile.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/offline-barcode-scanning-zebra-datawedge-couchbase-mobile\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/offline-barcode-scanning-zebra-datawedge-couchbase-mobile\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/offline-barcode-scanning-zebra-datawedge-couchbase-mobile\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/hero.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/hero.png","width":670,"height":404},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/offline-barcode-scanning-zebra-datawedge-couchbase-mobile\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Offline Inventory Scanning with Zebra DataWedge and Couchbase Mobile"}]},{"@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\/9b62593c8a13531e53d52fcd5aabbca4","name":"Hod Greeley, Defensor del Desarrollador, Couchbase","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/21eb69cb5d4a401fb23b149e4f4e9e87","url":"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g","caption":"Hod Greeley, Developer Advocate, Couchbase"},"description":"Hod Greeley es desarrollador de Couchbase y vive en Silicon Valley. Tiene m\u00e1s de dos d\u00e9cadas de experiencia como ingeniero de software y director de ingenier\u00eda. Ha trabajado en una variedad de campos de software, incluyendo f\u00edsica computacional y qu\u00edmica, seguridad inform\u00e1tica y de redes, finanzas y m\u00f3viles. Antes de unirse a Couchbase en 2016, Hod dirigi\u00f3 las relaciones con desarrolladores para m\u00f3viles en Samsung. Hod es doctor en f\u00edsica qu\u00edmica por la Universidad de Columbia.","sameAs":["https:\/\/hod.greeley.org\/blog","https:\/\/x.com\/HodGreeley"],"url":"https:\/\/www.couchbase.com\/blog\/es\/author\/hod-greeley\/"}]}},"authors":[{"term_id":9042,"user_id":73,"is_guest":0,"slug":"hod-greeley","display_name":"Hod Greeley, Developer Advocate, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g","author_category":"","last_name":"Greeley","first_name":"Hod","job_title":"","user_url":"https:\/\/hod.greeley.org\/blog","description":"Hod Greeley es desarrollador de Couchbase y vive en Silicon Valley. Tiene m\u00e1s de dos d\u00e9cadas de experiencia como ingeniero de software y director de ingenier\u00eda. Ha trabajado en una variedad de campos de software, incluyendo f\u00edsica computacional y qu\u00edmica, seguridad inform\u00e1tica y de redes, finanzas y m\u00f3viles. Antes de unirse a Couchbase en 2016, Hod dirigi\u00f3 las relaciones con desarrolladores para m\u00f3viles en Samsung. Hod es doctor en f\u00edsica qu\u00edmica por la Universidad de Columbia."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/5894","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\/73"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=5894"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/5894\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/5895"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=5894"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=5894"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=5894"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=5894"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}