Hace poco escribí sobre la creación de aplicaciones de escritorio con Couchbase Lite y JavaFX. Como se ha demostrado Couchbase es una excelente solución para el almacenamiento de datos y sincronización en una aplicación de escritorio debido a la Java SDK disponible. Sin embargo, soy consciente de que JavaFX no es para todo el mundo.
Existe otro framework similar para crear aplicaciones de escritorio en Java. Se llama Gluon, y también ofrece soporte para aplicaciones Android e iOS. Sin embargo, en este ejemplo nos centraremos estrictamente en el escritorio.
Vamos a ver cómo crear una aplicación de escritorio Gluon utilizando casi el mismo código que se encuentra en nuestro anterior ejemplo JavaFX.
Requisitos
Hay algunos requisitos para construir una aplicación Gluon que utilice Couchbase.
- JDK 1.7+
- IntelliJ IDEA
- Pasarela de sincronización Couchbase
Normalmente no hago de esto un requisito, pero es mucho más fácil crear una aplicación Gluon con un IDE como IntelliJ, por eso está en la lista. Hay un plugin para IntelliJ que construirá un proyecto Gluon con Gradle y todo lo que necesitas.
Aunque Couchbase Sync Gateway no es realmente un requisito, es necesario si quieres añadir soporte de sincronización entre tu aplicación y Couchbase Server / otras plataformas y dispositivos.
Creación de un nuevo proyecto Gluon
Si decide utilizar IntelliJ para compilar su proyecto, asegúrese de haber descargado el plugin Gluon tal y como se describe a continuación aquí.
Utilizando IntelliJ, cree un nuevo proyecto, pero elija crear un proyecto Gluon Desktop - Proyecto de vistas múltiples con FXML como se ve a continuación.
En última instancia, depende de usted hacia dónde ir a partir de aquí, pero para mantenerse lo más cerca posible de esta guía, dé a su proyecto un com.couchbaselabs nombre del paquete y gluón clase principal.
Todo lo que sigue puede dejarse por defecto ya que sólo vamos a hacer una aplicación de dos páginas con Gluon. Cuando hayamos terminado, es de esperar que nos quedemos con una estructura de archivos y directorios parecida a la siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
gradle envoltura src principal java com couchbaselabs vistas Presentador principal.java Vista principal.java Presentador secundario.java Vista secundaria.java CouchbaseSingleton.java Todo.java gluón.java recursos couchbaselabs vistas principal.fxml principal.css secundario.fxml secundario.css estilo.css icono.png construya.gradle gradlew gradlew.murciélago |
Te darás cuenta de que he creado algunos archivos adicionales, tales como CouchbaseSingleton.java y Todo.java.
Esencialmente tenemos vistas XML y controladores que van con esas vistas. Esto es muy similar a lo que vimos en un Aplicación JavaFX. A la hora de diseñar esas vistas, tenemos varias opciones. Podemos usar XML sin procesar, o podemos usar SceneBuilder. Ahora bien, no hay que confundir este SceneBuilder con el JavaFX SceneBuilder. Cometí este error y estuve dándome cabezazos durante bastante tiempo. La versión que queremos soportará aplicaciones Gluon.
Antes de empezar a añadir código de aplicación, debemos añadir nuestras dependencias al archivo Gradle del proyecto. Si no estás familiarizado con Gradle, hace el mismo trabajo que Maven o Ant. La sintaxis es diferente, pero yo personalmente lo encuentro un poco más limpio. Abra el proyecto de build.gradle e incluya el siguiente código:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
buildscript { repositorios { jcenter() } dependencias { ruta de clase org.javafxports:jfxmobile-plugin:1.0.8 } } aplicar plugin: org.javafxports.jfxmobile repositorios { jcenter() maven { url http://nexus.gluonhq.com/nexus/content/repositories/releases } } mainClassName = com.couchbaselabs.gluon dependencias { compilar com.gluonhq:charm:3.0.0 compilar com.couchbase.lite:couchbase-lite-java:1.3.0 desktopRuntime com.gluonhq:charm-desktop:3.0.0 } |
Lo más importante aquí son las dependencias:
1 2 3 4 5 6 7 |
dependencias { compilar com.gluonhq:charm:3.0.0 compilar com.couchbase.lite:couchbase-lite-java:1.3.0 desktopRuntime com.gluonhq:charm-desktop:3.0.0 } |
Esto incluirá la biblioteca Couchbase Lite, así como el tiempo de ejecución de la aplicación de escritorio para Gluon.
Con el proyecto listo, podemos empezar a desarrollar la aplicación.
Diseño de la capa de datos de Couchbase
Cuando trabajamos con Couchbase es una buena idea crear una instancia singleton del mismo. Esto significa que vamos a utilizar la misma instancia abierta durante toda la aplicación, hasta que decidamos cerrarla.
Abra el archivo src/main/java/com/couchbaselabs/CouchbaseSingleton.java e incluya el siguiente código:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
paquete com.couchbaselabs; importar com.couchbase.lite.*; importar com.couchbase.lite.replicador.Replicación; importar java.red.URL; importar java.util.ArrayList; importar java.util.HashMap; importar java.util.Iterador; importar java.util.Mapa; público clase CouchbaseSingleton { privado Director director; privado Base de datos base de datos; privado Replicación pushReplication; privado Replicación pullReplication; privado estático CouchbaseSingleton instancia = null; privado CouchbaseSingleton() { pruebe { este.director = nuevo Director(nuevo JavaContext("datos"), Director.OPCIONES_POR_DEFECTO); este.base de datos = este.director.getDatabase("proyecto fx"); Ver todoVer = base de datos.getView("todos"); todoVer.setMap(nuevo Mapeador() { @Anular público void mapa(Mapa<Cadena, Objeto> documento, Emisor emisor) { emisor.emite(documento.consiga("_id"), documento); } }, "1"); } captura (Excepción e) { e.printStackTrace(); } } público estático CouchbaseSingleton getInstance() { si(instancia == null) { instancia = nuevo CouchbaseSingleton(); } devolver instancia; } público Base de datos getDatabase() { devolver este.base de datos; } público void startReplication(URL pasarela, booleano continuo) { este.pushReplication = este.base de datos.createPushReplication(pasarela); este.pullReplication = este.base de datos.createPullReplication(pasarela); este.pushReplication.setContinuous(continuo); este.pullReplication.setContinuous(continuo); este.pushReplication.iniciar(); este.pullReplication.iniciar(); } público void stopReplication() { este.pushReplication.stop(); este.pullReplication.stop(); } público Todo guardar(Todo todo) { Mapa<Cadena, Objeto> propiedades = nuevo HashMap<Cadena, Objeto>(); Documento documento = este.base de datos.crearDocumento(); propiedades.poner("tipo", "todo"); propiedades.poner("título, todo.getTitle()); propiedades.poner("descripción", todo.getDescription()); pruebe { todo.setDocumentId(documento.putProperties(propiedades).getDocument().getId()); } captura (Excepción e) { e.printStackTrace(); } devolver todo; } público ArrayList consulta() { ArrayList resultados = nuevo ArrayList(); pruebe { Ver todoVer = este.base de datos.getView("todos"); Consulta consulta = todoVer.createQuery(); QueryEnumerator resultado = consulta.ejecute(); Documento documento = null; para (Iterador it = resultado; it.hasNext(); ) { Fila de consulta fila = it.siguiente(); documento = fila.getDocument(); resultados.añada(nuevo Todo(documento.getId(), (Cadena) documento.getProperty("título), (Cadena) documento.getProperty("descripción"))); } } captura (Excepción e) { e.printStackTrace(); } devolver resultados; } } |
Si viste la aplicación JavaFX que construí anteriormente, notarás que este singleton es el mismo entre los dos proyectos. Incluso puedes usar una versión similar para Android.
En el CouchbaseSingleton
estamos creando y abriendo una base de datos local llamada proyecto fx. Esta base de datos se utilizará en toda la aplicación. También estamos creando nuestra vista Couchbase Lite para realizar consultas. Este todos
emitirá un par clave-valor de id de documento y documento para cada documento de la base de datos local.
El método constructor es privado, lo que significa que no queremos que el usuario pueda instanciar un objeto desde él. En su lugar, queremos utilizar un método estático getInstance
para hacer el trabajo.
Aunque no nos ocuparemos de la replicación hasta más adelante en la guía, queremos sentar las bases. El sitio startReplication
nos permitirá definir una sincronización bidireccional con una pasarela de sincronización y el método stopReplication
nos permitirá detener la replicación, quizás cuando se cierre la aplicación.
Ahora tenemos nuestras funciones para guardar y cargar datos.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
público Todo guardar(Todo todo) { Mapa<Cadena, Objeto> propiedades = nuevo HashMap<Cadena, Objeto>(); Documento documento = este.base de datos.crearDocumento(); propiedades.poner("tipo", "todo"); propiedades.poner("título, todo.getTitle()); propiedades.poner("descripción", todo.getDescription()); pruebe { todo.setDocumentId(documento.putProperties(propiedades).getDocument().getId()); } captura (Excepción e) { e.printStackTrace(); } devolver todo; } |
En el guardar
aceptamos un método personalizado Todo
objeto. Este objeto sólo contiene un id, un título y una descripción. La clase se parece a esto:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
paquete com.couchbaselabs; importar java.util.*; público clase Todo { privado Cadena documentId; privado Cadena título; privado Cadena descripción; público Todo(Cadena documentId, Cadena título, Cadena descripción) { este.documentId = documentId; este.título = título; este.descripción = descripción; } público Todo(Cadena título, Cadena descripción) { este.documentId = UUID.randomUUID().toString(); este.título = título; este.descripción = descripción; } público void setDocumentId(Cadena documentId) { este.documentId = documentId; } público Cadena getDocumentId() { devolver este.documentId; } público Cadena getTitle() { devolver este.título; } público Cadena getDescription() { devolver este.descripción; } } |
Esta clase se encuentra en la sección src/main/java/com/couchbaselabs/Todo.java archivo. Lo que estamos haciendo en realidad es tomar el objeto y añadirlo como propiedades a un documento NoSQL de Couchbase. Después de guardar el documento y obtener un id, devolvemos el mismo documento con el id incluido.
La función de consulta ejecutará la vista que hemos creado anteriormente y añadirá cada uno de los elementos resultantes a un array de Todo
poniendo fin a nuestro singleton de base de datos.
Creación de una vista para listar datos
Vamos a crear una aplicación que utiliza múltiples vistas Gluon en lugar de tratar de meter todo en la misma vista. Esto no debe confundirse con Couchbase Lite Views que están en el tema de los datos, no UI.
La vista por defecto será la primera vista que aparezca cuando iniciemos la aplicación. Esta vista mostrará una lista de todos nuestros elementos de tareas. Si no se utiliza SceneBuilder, el marcado XML que se encuentra en src/main/resources/com/couchbaselabs/views/primary.fxml tendría el siguiente aspecto:
1 2 3 4 5 6 |
<!--?xml versión="1.0" codificación="UTF-8"?--> <!--?importar com.gluonhq.encanto.brilla.mvc.Ver?--> <!--?importar javafx.escena.control.ListView?--> <!--?importar javafx.escena.diseño.BorderPane?--> |
1 2 3 |
La vista resultante tendrá el siguiente aspecto:
Verá en la imagen que hay una barra de navegación con un botón, pero no aparece en el diseño XML. En su lugar, el diseño sólo contiene la vista de lista. Sin embargo, el XML hace referencia a nuestro src/main/java/com/couchbaselabs/views/PrimaryPresenter.java archivo. Este es el archivo donde no sólo definimos la barra de navegación, sino cualquier lógica que alimente la vista en particular.
En src/main/java/com/couchbaselabs/views/PrimaryPresenter.java se parecerá mucho a nuestro proyecto JavaFX, con las diferencias en el componente de navegación.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
paquete com.couchbaselabs.vistas; importar com.couchbaselabs.CouchbaseSingleton; importar com.couchbaselabs.Todo; importar com.couchbase.lite.Base de datos; importar com.couchbase.lite.Documento; importar com.couchbaselabs.gluón; importar com.gluonhq.encanto.brilla.aplicación.Aplicación móvil; importar com.gluonhq.encanto.brilla.control.AppBar; importar com.gluonhq.encanto.brilla.mvc.Ver; importar com.gluonhq.encanto.brilla.visual.MaterialDesignIcon; importar javafx.aplicación.Plataforma; importar javafx.colecciones.ObservableList; importar javafx.fxml.FXML; importar javafx.escena.control.ListaCelda; importar javafx.escena.control.ListView; importar javafx.util.Devolución de llamada; público clase Presentador principal { privado CouchbaseSingleton couchbase; @FXML privado Ver principal; @FXML privado ListView fxListView; público void inicializar() { pruebe { este.couchbase = CouchbaseSingleton.getInstance(); fxListView.getItems().addAll(este.couchbase.consulta()); este.couchbase.getDatabase().addChangeListener(nuevo Base de datos.ChangeListener() { @Anular público void cambiado(Base de datos.Evento de cambio evento) { para(int i = 0; i < evento.obtenerCambios().talla(); i++) { final Documento documento recuperado = couchbase.getDatabase().getDocument(evento.obtenerCambios().consiga(i).getDocumentId()); Plataforma.runLater(nuevo Ejecutable() { @Anular público void ejecute() { int documentIndex = indexOfByDocumentId(documento recuperado.getId(), fxListView.getItems()); para (int j = 0; j < fxListView.getItems().talla(); j++) { si (((Todo) fxListView.getItems().consiga(j)).getDocumentId().es igual a(documento recuperado.getId())) { documentIndex = j; romper; } } si (documento recuperado.isDeleted()) { si (documentIndex > -1) { fxListView.getItems().eliminar(documentIndex); } } si no { si (documentIndex == -1) { fxListView.getItems().añada(nuevo Todo(documento recuperado.getId(), (Cadena) documento recuperado.getProperty("título), (Cadena) documento recuperado.getProperty("descripción"))); } si no { fxListView.getItems().eliminar(documentIndex); fxListView.getItems().añada(nuevo Todo(documento recuperado.getId(), (Cadena) documento recuperado.getProperty("título), (Cadena) documento recuperado.getProperty("descripción"))); } } } }); } } }); } captura (Excepción e) { e.printStackTrace(); } fxListView.setCellFactory(nuevo Devolución de llamada<ListView, ListaCelda>() { @Anular público ListaCelda llame a(ListView p) { ListaCelda célula = nuevo ListaCelda() { @Anular protegido void updateItem(Todo t, booleano bln) { super.updateItem(t, bln); si (t != null) { setText(t.getTitle()); } } }; devolver célula; } }); principal.mostrarPropiedad().addListener((obs, oldValue, nuevoValor) -> { si (nuevoValor) { AppBar appBar = Aplicación móvil.getInstance().getAppBar(); appBar.setTitleText("Couchbase Todo - Lista"); appBar.getActionItems().añada(MaterialDesignIcon.AÑADE.botón(e -> Aplicación móvil.getInstance().switchView(gluón.SECONDARY_VIEW) )); } }); } privado int indexOfByDocumentId(Cadena aguja, ObservableList pajar) { int resultado = -1; para(int i = 0; i < pajar.talla(); i++) { si(pajar.consiga(i).getDocumentId().es igual a(aguja)) { resultado = i; romper; } } devolver resultado; } } |
En el archivo anterior tenemos la propiedad de vista de lista vinculada a la vista de lista real en el XML. Sin embargo, el código que realmente importa es el que se encuentra en el archivo inicializar
método. En él hacemos tres cosas fundamentales.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
fxListView.setCellFactory(nuevo Devolución de llamada<ListView, ListaCelda>() { @Anular público ListaCelda llame a(ListView p) { ListaCelda célula = nuevo ListaCelda() { @Anular protegido void updateItem(Todo t, booleano bln) { super.updateItem(t, bln); si (t != null) { setText(t.getTitle()); } } }; devolver célula; } }); |
En el código anterior definimos cómo aparecerán los datos en la lista. Por defecto sólo acepta datos de cadena, así que lo anulamos para que tome el título de nuestro Todo
objetos.
1 2 3 4 5 6 7 8 9 10 11 |
principal.mostrarPropiedad().addListener((obs, oldValue, nuevoValor) -> { si (nuevoValor) { AppBar appBar = Aplicación móvil.getInstance().getAppBar(); appBar.setTitleText("Couchbase Todo - Lista"); appBar.getActionItems().añada(MaterialDesignIcon.AÑADE.botón(e -> Aplicación móvil.getInstance().switchView(gluón.SECONDARY_VIEW) )); } }); |
En el listener anterior establecemos el título de nuestra barra de navegación así como el botón. Cuando se pulse el botón, la vista cambiará a nuestra vista secundaria.
Por último, nos queda ejecutar la consulta inicial de datos y rellenar la lista, así como estar atentos a los nuevos datos que vayan llegando. Si llegan cambios, se iterará sobre ellos y se revisarán los indicadores en cada documento modificado. Si se ha eliminado un indicador, los datos se borrarán de la lista. Si se ha producido un cambio, los datos de la vista de lista se eliminarán y, a continuación, se sustituirán. En caso contrario, sólo se añadirán los datos. Dado que el listener opera en un subproceso en segundo plano, los cambios en la interfaz de usuario deben realizarse dentro del subproceso Plataforma.runLater
.
Esto nos lleva al segundo y último punto de vista.
Creación de una vista para guardar datos
La segunda vista tendrá un formulario y será responsable de que las entradas del usuario se añadan a la base de datos y se muestren en la vista anterior. El marcado XML que alimenta esta vista tendrá el siguiente aspecto:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 |
<!--?xml versión="1.0" codificación="UTF-8"?--> <!--?importar com.gluonhq.encanto.brilla.mvc.Ver?--> <!--?importar javafx.geometría.Inserciones?--> <!--?importar javafx.escena.control.Área de texto?--> <!--?importar javafx.escena.control.Campo de texto?--> <!--?importar javafx.escena.diseño.BorderPane?--> <!--?importar javafx.escena.diseño.VBox?--> <textarea> </niños> </VBox> </top> <acolchado> <Inserciones fondo="10.0" izquierda="10.0" derecha="10.0" top="10.0" /> </acolchado> </Ver> </código> </pre> <p>En XML sobre es encontrado en el <fuerte>src/principal/recursos/com/couchbaselabs/vistas/secundario.fxml</fuerte> archivo y el ver sí mismo mira como el siguiente:</p> <p><img src="/wp-content/original-assets/2016/october/using-couchbase-lite-in-a-java-gluon-application/cb-gluon-desktop-4.png" /></p> <p>Aviso que allí son dos <código>Campo de texto</código> entradas. En se sea importante en el <fuerte>src/principal/java/com/couchbaselabs/vistas/Presentador secundario.java</fuerte> archivo referenciada en el XML. Este archivo contiene el siguiente código:</p> <pre> <código> paquete com.couchbaselabs.vistas; importar com.couchbaselabs.CouchbaseSingleton; importar com.couchbaselabs.Todo; importar com.gluonhq.encanto.brilla.animación.BounceInRightTransition; importar com.gluonhq.encanto.brilla.aplicación.Aplicación móvil; importar com.gluonhq.encanto.brilla.control.AppBar; importar com.gluonhq.encanto.brilla.diseño.capa.FloatingActionButton; importar com.gluonhq.encanto.brilla.mvc.Ver; importar com.gluonhq.encanto.brilla.visual.MaterialDesignIcon; importar javafx.fxml.FXML; importar javafx.escena.control.Alerta; importar javafx.escena.control.Área de texto; importar javafx.escena.control.Campo de texto; público clase Presentador secundario { privado CouchbaseSingleton couchbase; @FXML privado Ver secundario; @FXML privado Campo de texto fxTítulo; @FXML privado Área de texto fxDescription; público void inicializar() { este.couchbase = CouchbaseSingleton.getInstance(); secundario.setShowTransitionFactory(BounceInRightTransition::nuevo); secundario.getLayers().añada(nuevo FloatingActionButton(MaterialDesignIcon.GUARDAR.texto, e -> guardar() )); secundario.mostrarPropiedad().addListener((obs, oldValue, nuevoValor) -> { si (nuevoValor) { AppBar appBar = Aplicación móvil.getInstance().getAppBar(); appBar.setTitleText("Couchbase Todo - Crear"); } }); } privado void guardar() { si(!fxTítulo.getText().es igual a("") && !fxDescription.getText().es igual a("")) { couchbase.guardar(nuevo Todo(fxTítulo.getText(), fxDescription.getText())); fxTítulo.setText(""); fxDescription.setText(""); Aplicación móvil.getInstance().switchToPreviousView(); } si no { Alerta alerta = nuevo Alerta(Alerta.Tipo de alerta.INFORMACIÓN); alerta.setTitle("Información que falta"); alerta.setHeaderText(null); alerta.setContentText("Tanto el título como la descripción son necesarios para este ejemplo".); alerta.showAndWait(); } } } </código> </pre> <p>En entrada campos son mapeado a este controlador, pero qué realmente asuntos aquí es el código para añadiendo el flotante acción botón y ajuste el navegación bar título.</p> <pre> <código> secundario.getLayers().añada(nuevo FloatingActionButton(MaterialDesignIcon.GUARDAR.texto, e -> guardar() )); secundario.mostrarPropiedad().addListener((obs, oldValue, nuevoValor) -> { si (nuevoValor) { AppBar appBar = Aplicación móvil.getInstance().getAppBar(); appBar.setTitleText("Couchbase Todo - Crear"); } }); </código> </pre> <p>En el flotante acción botón es haga clic en, el <código>guardar</código> método es llamado. En el <código>guardar</código> método nosotros consulte a escriba a seguro el entrada campos son no en blanco y si ellos aren't, guarde los datos y navegue hacia atrás en la pila hasta la vista anterior. Vista anterior. Sincronización de datos con Couchbase Sync GatewayHasta ahora, cada parte de nuestra aplicación Gluon fue construida para uso local sin conexión. Sin embargo, incluir el soporte de sincronización en la mezcla no sólo es útil, sino increíblemente fácil. Sin conexión. En este punto yo' m ir a a asuma ustedHemos descargado e instalado Couchbase Sync Gateway. Antes de ejecutarlo, necesitamos crear un archivo de configuración. Crea un archivo JSON con lo siguiente:. <code> { "log":["CRUD+", "REST+", "Changes+", "Attach+"], "bases de datos": { "fx-example": { "servidor": "morsa:", "sync":` function (doc) { canal (doc.canales); } `, "usuarios": { "INVITADO": { "disabled": falso, "admin_channels": ["*"] } } } } } El archivo de configuración anterior es uno de los más simples que puede hacer para Sync Gateway. Usted' re crear a partición llamado <fuerte>fx-ejemplo</fuerte> en el en-memoria base de datos <fuerte>morsa</fuerte> y usted're aceptar todos los documentos de todo el mundo sin permisos de lectura o escritura.Ejecutar esta configuración con Sync Gateway won' t consiga us muy lejos pero porque nosotros haven't activado el soporte de sincronización en nuestra aplicación. Abra el proyecto's <fuerte>src/principal/java/com/couchbaselabs/gluón.java</fuerte> archivo y incluir el siguiente:</p><pre> <código> paquete com.couchbaselabs; importar com.couchbaselabs.vistas.Vista principal; importar com.couchbaselabs.vistas.Vista secundaria; importar com.gluonhq.encanto.brilla.aplicación.Aplicación móvil; importar com.gluonhq.encanto.brilla.visual.Swatch; importar javafx.escena.Escena; público clase gluón extiende Aplicación móvil { público estático final Cadena PRIMARY_VIEW = VISTA_INICIAL; público estático final Cadena SECONDARY_VIEW = "Vista Secundaria"; público CouchbaseSingleton couchbase; @Anular público void init() { addViewFactory(PRIMARY_VIEW, () -> nuevo Vista principal(PRIMARY_VIEW).getView()); addViewFactory(SECONDARY_VIEW, () -> nuevo Vista secundaria(SECONDARY_VIEW).getView()); } @Anular público void postInit(Escena escena) { Swatch.AZUL.assignTo(escena); escena.getStylesheets().añada(gluón.clase.getResource("style.css").toExternalForm()); pruebe { este.couchbase = CouchbaseSingleton.getInstance(); este.couchbase.startReplication(nuevo URL("http://localhost:4984/fx-example/"), verdadero); } captura (Excepción e) { e.printStackTrace(); } } } </código> </pre> <p>Realmente nosotros sólo atención acerca de el <código>startReplication</código> línea en el <código>postInit</código> método. Una vez nosotros llame a it, replicación se suceder en ambos direcciones, continuamente.</p> <h2>Conclusión</h2> <p>Usted sólo sierra cómo a crear a Java escritorio aplicación con Gluon y Couchbase. Utilizando Gradle usted puede construya y ejecute el aplicación y con a algunos revisiones it puede sea convertido a Android como bien.</p> <p>En completo fuente código a este proyecto puede sea encontrado en GitHub <a href="https://github.com/couchbaselabs/couchbase-lite-gluon-example">aquí</a>.</p> </textarea> |