Recentemente, escrevi sobre a criação de aplicativos de desktop com Couchbase Lite e JavaFX. Conforme demonstrado, o Couchbase é uma excelente solução para armazenamento e sincronização de dados em um aplicativo de desktop devido ao Java SDK disponível. No entanto, sei que o JavaFX não é para todos.
Há outra estrutura semelhante para a criação de aplicativos de desktop em Java. Ela se chama Gluon e também oferece suporte para aplicativos Android e iOS. No entanto, neste exemplo, estamos analisando estritamente o desktop.
Veremos como criar um aplicativo de desktop Gluon usando praticamente o mesmo código encontrado em nosso exemplo anterior de JavaFX.
Os requisitos
Há alguns requisitos para criar um aplicativo Gluon que use o Couchbase.
- JDK 1.7+
- IntelliJ IDEA
- Gateway de sincronização do Couchbase
Normalmente, não faço disso um requisito, mas é muito mais fácil criar um aplicativo Gluon com um IDE como o IntelliJ, por isso ele está na lista. Há um plug-in para o IntelliJ que criará um projeto Gluon com o Gradle e tudo o que você precisa.
Embora o Couchbase Sync Gateway não seja realmente um requisito, ele é necessário se você quiser adicionar suporte à sincronização entre seu aplicativo e o Couchbase Server/outras plataformas e dispositivos.
Criação de um novo projeto Gluon
Se você decidir usar o IntelliJ para criar seu projeto, certifique-se de que já tenha feito o download do plug-in Gluon, conforme descrito aqui.
Usando o IntelliJ, crie um novo projeto, mas opte por criar um projeto Gluon Desktop - Projeto de múltiplas visualizações com FXML conforme mostrado abaixo.
Em última análise, cabe a você decidir o que fazer a partir daqui, mas para ficar o mais próximo possível deste guia, dê ao seu projeto um com.couchbaselabs nome do pacote e glúon classe principal.
Tudo o que vem a seguir pode ser deixado como padrão, pois faremos apenas um aplicativo de duas páginas com o Gluon. Quando terminarmos, esperamos ter uma estrutura de arquivos e diretórios parecida com a seguinte:
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 |
gradil invólucro src principal java com couchbaselabs visualizações Apresentador principal.java PrimaryView.java Apresentador secundário.java Visão secundária.java CouchbaseSingleton.java Todo.java glúon.java recursos couchbaselabs visualizações primário.fxml primário.css secundário.fxml secundário.css estilo.css ícone.png construir.gradil Gradlew Gradlew.morcego |
Você notará que eu criei alguns arquivos extras, como CouchbaseSingleton.java e Todo.java.
Essencialmente, temos exibições XML e controladores para acompanhar essas exibições. Isso é muito semelhante ao que vimos em um Aplicativo JavaFX. Quando se trata de projetar essas exibições, temos algumas opções. Podemos usar XML bruto ou podemos usar Criador de cenas. Agora, esse SceneBuilder não deve ser confundido com o JavaFX SceneBuilder. Eu cometi esse erro e fiquei batendo cabeça por um bom tempo. A versão que queremos oferecerá suporte a aplicativos Gluon.
Antes de começarmos a adicionar o código do aplicativo, devemos adicionar nossas dependências ao arquivo Gradle do projeto. Se você não estiver familiarizado com o Gradle, ele faz o mesmo trabalho que o Maven ou o Ant. A sintaxe é diferente, mas eu a considero um pouco mais limpa. Abra o arquivo build.gradle e inclua o seguinte 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 { repositórios { jcentro() } dependências { caminho de classe 'org.javafxports:jfxmobile-plugin:1.0.8' } } aplicar plug-in: 'org.javafxports.jfxmobile' repositórios { jcentro() mentor { url 'http://nexus.gluonhq.com/nexus/content/repositories/releases' } } mainClassName = 'com.couchbaselabs.gluon' dependências { 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' } |
O que é particularmente importante aqui são as dependências:
1 2 3 4 5 6 7 |
dependências { 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' } |
Isso incluirá a biblioteca Couchbase Lite, bem como o tempo de execução do aplicativo de desktop para o Gluon.
Com o projeto pronto, podemos começar a desenvolver o aplicativo.
Projetando a camada de dados do Couchbase
Ao trabalhar com o Couchbase, é uma boa ideia criar uma instância única dele. Isso significa que usaremos a mesma instância aberta durante todo o aplicativo, até decidirmos fechá-la.
Abra o arquivo src/main/java/com/couchbaselabs/CouchbaseSingleton.java e inclua o seguinte 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 |
pacote com.couchbaselabs; importação com.couchbase.leve.*; importação com.couchbase.leve.replicador.Replicação; importação java.rede.URL; importação java.util.ArrayList; importação java.util.HashMap; importação java.util.Iterador; importação java.util.Mapa; público classe CouchbaseSingleton { privado Gerente gerente; privado Banco de dados banco de dados; privado Replicação pushReplication; privado Replicação pullReplication; privado estático CouchbaseSingleton instância = nulo; privado CouchbaseSingleton() { tentar { este.gerente = novo Gerente(novo JavaContext("dados"), Gerente.DEFAULT_OPTIONS); este.banco de dados = este.gerente.getDatabase("fx-project"); Ver todoView = banco de dados.getView("todos"); todoView.setMap(novo Mapeador() { @Substituir público vazio mapa(Mapa<Cordas, Objeto> documento, Emissor emissor) { emissor.emitir(documento.obter("_id"), documento); } }, "1"); } captura (Exceção e) { e.printStackTrace(); } } público estático CouchbaseSingleton getInstance() { se(instância == nulo) { instância = novo CouchbaseSingleton(); } retorno instância; } público Banco de dados getDatabase() { retorno este.banco de dados; } público vazio startReplication(URL portal, booleano contínuo) { este.pushReplication = este.banco de dados.createPushReplication(portal); este.pullReplication = este.banco de dados.createPullReplication(portal); este.pushReplication.setContinuous(contínuo); este.pullReplication.setContinuous(contínuo); este.pushReplication.iniciar(); este.pullReplication.iniciar(); } público vazio stopReplication() { este.pushReplication.parar(); este.pullReplication.parar(); } público Todo salvar(Todo todo) { Mapa<Cordas, Objeto> propriedades = novo HashMap<Cordas, Objeto>(); Documento documento = este.banco de dados.createDocument(); propriedades.colocar("tipo", "todo"); propriedades.colocar("título", todo.getTitle()); propriedades.colocar("description" (descrição), todo.getDescription()); tentar { todo.setDocumentId(documento.putProperties(propriedades).getDocument().getId()); } captura (Exceção e) { e.printStackTrace(); } retorno todo; } público ArrayList consulta() { ArrayList resultados = novo ArrayList(); tentar { Ver todoView = este.banco de dados.getView("todos"); Consulta consulta = todoView.createQuery(); QueryEnumerator resultado = consulta.executar(); Documento documento = nulo; para (Iterador ele = resultado; ele.hasNext(); ) { QueryRow fila = ele.próxima(); documento = fila.getDocument(); resultados.adicionar(novo Todo(documento.getId(), (Cordas) documento.getProperty("título"), (Cordas) documento.getProperty("description" (descrição)))); } } captura (Exceção e) { e.printStackTrace(); } retorno resultados; } } |
Se você viu o aplicativo JavaFX que criei anteriormente, perceberá que esse singleton é o mesmo entre os dois projetos. Você pode até usar uma versão semelhante para Android.
No CouchbaseSingleton
estamos criando e abrindo um banco de dados local chamado projeto fx. Esse banco de dados será usado em todo o aplicativo. Também estamos criando nossa visualização do Couchbase Lite para consulta. Essa todos
emitirá um par de valores-chave de id de documento e documento para cada documento no banco de dados local.
O método do construtor é privado, o que significa que não queremos que o usuário possa instanciar um objeto a partir dele. Em vez disso, queremos usar um método estático getInstance
para realizar o trabalho.
Embora não vamos nos preocupar com a replicação até o final do guia, queremos estabelecer a base. A startReplication
nos permitirá definir a sincronização bidirecional com um Sync Gateway e o método stopReplication
nos permitirá interromper a replicação, talvez quando o aplicativo for fechado.
Agora temos nossas funções para salvar e carregar dados.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
público Todo salvar(Todo todo) { Mapa<Cordas, Objeto> propriedades = novo HashMap<Cordas, Objeto>(); Documento documento = este.banco de dados.createDocument(); propriedades.colocar("tipo", "todo"); propriedades.colocar("título", todo.getTitle()); propriedades.colocar("description" (descrição), todo.getDescription()); tentar { todo.setDocumentId(documento.putProperties(propriedades).getDocument().getId()); } captura (Exceção e) { e.printStackTrace(); } retorno todo; } |
No salvar
estamos aceitando um método personalizado Todo
objeto. Na verdade, esse objeto contém apenas uma identificação, um título e uma descrição. A classe tem a seguinte aparência:
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 |
pacote com.couchbaselabs; importação java.util.*; público classe Todo { privado Cordas documentId; privado Cordas título; privado Cordas descrição; público Todo(Cordas documentId, Cordas título, Cordas descrição) { este.documentId = documentId; este.título = título; este.descrição = descrição; } público Todo(Cordas título, Cordas descrição) { este.documentId = UUID.UUUID aleatório().toString(); este.título = título; este.descrição = descrição; } público vazio setDocumentId(Cordas documentId) { este.documentId = documentId; } público Cordas getDocumentId() { retorno este.documentId; } público Cordas getTitle() { retorno este.título; } público Cordas getDescription() { retorno este.descrição; } } |
A classe acima é encontrada no src/main/java/com/couchbaselabs/Todo.java arquivo. O que estamos fazendo é, na verdade, pegar o objeto e adicioná-lo como propriedades a um documento NoSQL do Couchbase. Depois de salvar o documento e obter um ID, retornamos o mesmo documento com o ID incluído.
A função de consulta executará a exibição que criamos anteriormente e adicionará cada um dos itens de resultado a uma matriz de Todo
encerrando nosso banco de dados singleton.
Criação de uma visualização para dados de listagem
Vamos criar um aplicativo que usa várias exibições do Gluon em vez de tentar colocar tudo na mesma exibição. Isso não deve ser confundido com as exibições do Couchbase Lite, que tratam de dados e não de interface do usuário.
A exibição padrão será a primeira exibida quando iniciarmos o aplicativo. Essa visualização mostrará uma lista de todos os nossos elementos de todo. Se não estiver usando o SceneBuilder, a marcação XML encontrada em src/main/resources/com/couchbaselabs/views/primary.fxml seria parecido com o seguinte:
1 2 3 4 5 6 |
<!--?xml versão="1.0" codificação="UTF-8"?--> <!--?importação com.gluonhq.charme.brilhar.mvc.Ver?--> <!--?importação javafx.cena.controle.Visualização de lista?--> <!--?importação javafx.cena.layout.BorderPane?--> |
1 2 3 |
A visualização resultante será parecida com a seguinte:
Você verá na imagem que há uma barra de navegação com um botão, mas ela não aparece no layout XML. Em vez disso, o layout contém apenas a exibição de lista. No entanto, o XML faz referência ao nosso src/main/java/com/couchbaselabs/views/PrimaryPresenter.java file. Esse é o arquivo em que definimos não apenas a barra de navegação, mas também qualquer lógica que potencialize a exibição específica.
O src/main/java/com/couchbaselabs/views/PrimaryPresenter.java terá muita semelhança com o nosso projeto JavaFX, com as diferenças no componente de navegação.
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 |
pacote com.couchbaselabs.visualizações; importação com.couchbaselabs.CouchbaseSingleton; importação com.couchbaselabs.Todo; importação com.couchbase.leve.Banco de dados; importação com.couchbase.leve.Documento; importação com.couchbaselabs.glúon; importação com.gluonhq.charme.brilhar.aplicativo.Aplicativo móvel; importação com.gluonhq.charme.brilhar.controle.AppBar; importação com.gluonhq.charme.brilhar.mvc.Ver; importação com.gluonhq.charme.brilhar.visual.MaterialDesignIcon; importação javafx.aplicativo.Plataforma; importação javafx.coleções.Lista de observáveis; importação javafx.fxml.FXML; importação javafx.cena.controle.ListCell; importação javafx.cena.controle.Visualização de lista; importação javafx.util.Retorno de chamada; público classe Apresentador principal { privado CouchbaseSingleton couchbase; @FXML privado Ver primário; @FXML privado Visualização de lista fxListView; público vazio inicializar() { tentar { este.couchbase = CouchbaseSingleton.getInstance(); fxListView.getItems().addAll(este.couchbase.consulta()); este.couchbase.getDatabase().addChangeListener(novo Banco de dados.ChangeListener() { @Substituir público vazio alterado(Banco de dados.ChangeEvent evento) { para(int i = 0; i < evento.getChanges().tamanho(); i++) { final Documento retrievedDocument (documento recuperado) = couchbase.getDatabase().getDocument(evento.getChanges().obter(i).getDocumentId()); Plataforma.runLater(novo Executável() { @Substituir público vazio executar() { int documentIndex = indexOfByDocumentId(retrievedDocument (documento recuperado).getId(), fxListView.getItems()); para (int j = 0; j < fxListView.getItems().tamanho(); j++) { se (((Todo) fxListView.getItems().obter(j)).getDocumentId().iguais(retrievedDocument (documento recuperado).getId())) { documentIndex = j; quebra; } } se (retrievedDocument (documento recuperado).isDeleted()) { se (documentIndex > -1) { fxListView.getItems().remover(documentIndex); } } mais { se (documentIndex == -1) { fxListView.getItems().adicionar(novo Todo(retrievedDocument (documento recuperado).getId(), (Cordas) retrievedDocument (documento recuperado).getProperty("título"), (Cordas) retrievedDocument (documento recuperado).getProperty("description" (descrição)))); } mais { fxListView.getItems().remover(documentIndex); fxListView.getItems().adicionar(novo Todo(retrievedDocument (documento recuperado).getId(), (Cordas) retrievedDocument (documento recuperado).getProperty("título"), (Cordas) retrievedDocument (documento recuperado).getProperty("description" (descrição)))); } } } }); } } }); } captura (Exceção e) { e.printStackTrace(); } fxListView.setCellFactory(novo Retorno de chamada<Visualização de lista, ListCell>() { @Substituir público ListCell chamada(Visualização de lista p) { ListCell célula = novo ListCell() { @Substituir protegida vazio updateItem(Todo t, booleano bln) { super.updateItem(t, bln); se (t != nulo) { setText(t.getTitle()); } } }; retorno célula; } }); primário.showingProperty().addListener((obs, Valor antigo, novoValor) -> { se (novoValor) { AppBar Barra de aplicativos = Aplicativo móvel.getInstance().getAppBar(); Barra de aplicativos.setTitleText("Couchbase Todo - Lista"); Barra de aplicativos.getActionItems().adicionar(MaterialDesignIcon.ADD.botão(e -> Aplicativo móvel.getInstance().switchView(glúon.SECONDARY_VIEW) )); } }); } privado int indexOfByDocumentId(Cordas agulha, Lista de observáveis palheiro) { int resultado = -1; para(int i = 0; i < palheiro.tamanho(); i++) { se(palheiro.obter(i).getDocumentId().iguais(agulha)) { resultado = i; quebra; } } retorno resultado; } } |
No arquivo acima, temos a propriedade de exibição de lista vinculada à exibição de lista real no XML. O código que realmente importa, no entanto, é o código encontrado no arquivo inicializar
método. Nele, fazemos três coisas fundamentais.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
fxListView.setCellFactory(novo Retorno de chamada<Visualização de lista, ListCell>() { @Substituir público ListCell chamada(Visualização de lista p) { ListCell célula = novo ListCell() { @Substituir protegida vazio updateItem(Todo t, booleano bln) { super.updateItem(t, bln); se (t != nulo) { setText(t.getTitle()); } } }; retorno célula; } }); |
No código acima, definimos como os dados aparecerão na lista. Por padrão, ele aceita apenas dados de cadeia de caracteres, portanto, nós o substituímos para obter o título do nosso Todo
objetos.
1 2 3 4 5 6 7 8 9 10 11 |
primário.showingProperty().addListener((obs, Valor antigo, novoValor) -> { se (novoValor) { AppBar Barra de aplicativos = Aplicativo móvel.getInstance().getAppBar(); Barra de aplicativos.setTitleText("Couchbase Todo - Lista"); Barra de aplicativos.getActionItems().adicionar(MaterialDesignIcon.ADD.botão(e -> Aplicativo móvel.getInstance().switchView(glúon.SECONDARY_VIEW) )); } }); |
No listener acima, definimos o título da nossa barra de navegação e o botão. Quando o botão for pressionado, a exibição será alterada para a exibição secundária.
Por fim, resta-nos executar a consulta inicial de dados e preencher a lista, além de ouvir os novos dados à medida que eles chegam. Se houver alterações, elas serão iteradas e os indicadores serão revisados em cada documento alterado. Se houver um indicador excluído, os dados serão removidos do modo de exibição de lista. Se houver uma alteração, os dados do modo de exibição de lista serão removidos e, em seguida, substituídos. Caso contrário, os dados serão apenas adicionados. Como o ouvinte opera em um thread em segundo plano, as alterações na interface do usuário devem ser feitas dentro do thread Plataforma.runLater
.
Isso nos leva à segunda e última visão.
Criação de uma visualização para salvar dados
A segunda visualização terá um formulário e será responsável pela entrada do usuário a ser adicionada ao banco de dados e exibida na visualização anterior. A marcação XML que alimenta essa visualização terá a seguinte aparência:
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 versão="1.0" codificação="UTF-8"?--> <!--?importação com.gluonhq.charme.brilhar.mvc.Ver?--> <!--?importação javafx.geometria.Insetos?--> <!--?importação javafx.cena.controle.TextArea?--> <!--?importação javafx.cena.controle.TextField?--> <!--?importação javafx.cena.layout.BorderPane?--> <!--?importação javafx.cena.layout.VBox?--> <área de texto> </crianças> </VBox> </superior> <acolchoamento> <Insetos fundo="10.0" esquerda="10.0" direito="10.0" superior="10.0" /> </acolchoamento> </Ver> </código> </pré> <p>O XML acima é encontrado em o <forte>src/principal/recursos/com/couchbaselabs/visualizações/secundário.fxml</forte> arquivo e o visualização em si aparência como o seguintes:</p> <p><imagem src="/wp-content/original-assets/2016/october/using-couchbase-lite-in-a-java-gluon-application/cb-gluon-desktop-4.png" /></p> <p>Aviso que lá são dois <código>TextField</código> insumos. Eles vontade ser importante em o <forte>src/principal/java/com/couchbaselabs/visualizações/Apresentador secundário.java</forte> arquivo referenciado em o XML. Isso arquivo contém o seguintes código:</p> <pré> <código> pacote com.couchbaselabs.visualizações; importação com.couchbaselabs.CouchbaseSingleton; importação com.couchbaselabs.Todo; importação com.gluonhq.charme.brilhar.animação.BounceInRightTransition; importação com.gluonhq.charme.brilhar.aplicativo.Aplicativo móvel; importação com.gluonhq.charme.brilhar.controle.AppBar; importação com.gluonhq.charme.brilhar.layout.camada.FloatingActionButton; importação com.gluonhq.charme.brilhar.mvc.Ver; importação com.gluonhq.charme.brilhar.visual.MaterialDesignIcon; importação javafx.fxml.FXML; importação javafx.cena.controle.Alerta; importação javafx.cena.controle.TextArea; importação javafx.cena.controle.TextField; público classe Apresentador secundário { privado CouchbaseSingleton couchbase; @FXML privado Ver secundário; @FXML privado TextField fxTitle; @FXML privado TextArea fxDescrição; público vazio inicializar() { este.couchbase = CouchbaseSingleton.getInstance(); secundário.setShowTransitionFactory(BounceInRightTransition::novo); secundário.getLayers().adicionar(novo FloatingActionButton(MaterialDesignIcon.SALVAR.texto, e -> salvar() )); secundário.showingProperty().addListener((obs, Valor antigo, novoValor) -> { se (novoValor) { AppBar Barra de aplicativos = Aplicativo móvel.getInstance().getAppBar(); Barra de aplicativos.setTitleText("Couchbase Todo - Criar"); } }); } privado vazio salvar() { se(!fxTitle.getText().iguais("") &lificador;&lificador; !fxDescrição.getText().iguais("")) { couchbase.salvar(novo Todo(fxTitle.getText(), fxDescrição.getText())); fxTitle.setText(""); fxDescrição.setText(""); Aplicativo móvel.getInstance().switchToPreviousView(); } mais { Alerta alerta = novo Alerta(Alerta.Tipo de alerta.INFORMAÇÕES); alerta.setTitle("Informações ausentes"); alerta.setHeaderText(nulo); alerta.setContentText("Tanto o título quanto a descrição são necessários para este exemplo."); alerta.showAndWait(); } } } </código> </pré> <p>O entrada campos são mapeado para este controlador, mas o que realmente assuntos aqui é o código para adicionando o flutuante ação botão e configuração o navegação bar título.</p> <pré> <código> secundário.getLayers().adicionar(novo FloatingActionButton(MaterialDesignIcon.SALVAR.texto, e -> salvar() )); secundário.showingProperty().addListener((obs, Valor antigo, novoValor) -> { se (novoValor) { AppBar Barra de aplicativos = Aplicativo móvel.getInstance().getAppBar(); Barra de aplicativos.setTitleText("Couchbase Todo - Criar"); } }); </código> </pré> <p>Quando o flutuante ação botão é clicado, o <código>salvar</código> método é chamado. Em o <código>salvar</código> método nós verificar para fazer com certeza o entrada campos são não em branco e se eles são't, salve os dados e navegue para trás na pilha até a exibição anterior. Sincronização de dados com o Couchbase Sync GatewayAté agora, todas as partes do nosso aplicativo Gluon foram criadas para uso local off-line. No entanto, incluir o suporte à sincronização na mistura não é apenas útil, mas incrivelmente fácil. Até o momento, eu' m indo para assumir vocêFizemos o download e instalamos o Couchbase Sync Gateway. Antes de executá-lo, precisamos criar um arquivo de configuração. Crie um arquivo JSON com o seguinte:<code> { "log":["CRUD+", "REST+", "Changes+", "Attach+"], "bancos de dados": { "fx-example": { "servidor": "morsa:", "sync":` function (doc) { channel (doc.channels); } `, "users": { "GUEST": { "disabled": falso, "admin_channels": ["*"] } } } } } O arquivo de configuração acima é um dos mais simples que você pode criar para o Sync Gateway. Você' re criando a partição chamado <forte>fx-exemplo</forte> dentro de o em-memória banco de dados <forte>morsa</forte> e vocêestão aceitando todos os documentos de todos sem permissões de leitura ou gravação.Executar essa configuração com o Sync Gateway não vai t obter nós muito longe ainda porque nós abrigo't ativou o suporte à sincronização em nosso aplicativo. Abra o projeto's <forte>src/principal/java/com/couchbaselabs/glúon.java</forte> arquivo e incluir o seguintes:</p><pré> <código> pacote com.couchbaselabs; importação com.couchbaselabs.visualizações.PrimaryView; importação com.couchbaselabs.visualizações.Visão secundária; importação com.gluonhq.charme.brilhar.aplicativo.Aplicativo móvel; importação com.gluonhq.charme.brilhar.visual.Swatch; importação javafx.cena.Cena; público classe glúon se estende Aplicativo móvel { público estático final Cordas PRIMARY_VIEW = HOME_VIEW; público estático final Cordas SECONDARY_VIEW = "Vista secundária"; público CouchbaseSingleton couchbase; @Substituir público vazio inicial() { addViewFactory(PRIMARY_VIEW, () -> novo PrimaryView(PRIMARY_VIEW).getView()); addViewFactory(SECONDARY_VIEW, () -> novo Visão secundária(SECONDARY_VIEW).getView()); } @Substituir público vazio postInit(Cena cena) { Swatch.AZUL.assignTo(cena); cena.getStylesheets().adicionar(glúon.classe.getResource("style.css").toExternalForm()); tentar { este.couchbase = CouchbaseSingleton.getInstance(); este.couchbase.startReplication(novo URL("http://localhost:4984/fx-example/"), verdadeiro); } captura (Exceção e) { e.printStackTrace(); } } } </código> </pré> <p>Realmente nós somente cuidados sobre o <código>startReplication</código> linha em o <código>postInit</código> método. Uma vez nós chamada ele, replicação vontade acontecer em ambos direções, continuamente.</p> <h2>Conclusão</h2> <p>Você apenas serra como para criar a Java desktop aplicativo com Glúon e Couchbase. Usando Gradle você pode construir e executar o aplicativo e com a poucos revisões ele pode ser convertido para Android como bem.</p> <p>O completo fonte código para este projeto pode ser encontrado em GitHub <a href="https://github.com/couchbaselabs/couchbase-lite-gluon-example">aqui</a>.</p> </área de texto> |