Foto do mapa mais antigo conhecido
Foto cortesia de cea + com permissão sob licença CC BY 2.0
Nesta postagem, gostaria de continuar explorando os elementos fundamentais da Couchbase Mobile no Android. Grande parte das informações também se aplicará ao iOS. Aguarde mais informações sobre o iOS especificamente e sobre ferramentas multiplataforma em breve.
Você pode ler uma visão geral de nível médio sobre por que me converti ao NoSQL e ao uso de Couchbase Lite em vez de SQLite e outras opções de armazenamento para dispositivos móveis aqui.
Esta postagem fará com que você comece a usar o Android em alguns minutos. E este explora as operações básicas do banco de dados. Você verá nessa postagem que eu uso Mapas
extensivamente.
Lidando diretamente com JSON
Você pode fazer muitas coisas com mapas. Muitas vezes, você também extrai dados para outras estruturas, como listas. Isso pode ser tudo o que você precisa. Aqui está um exemplo do tipo de tipificação necessária.
1 |
Lista comentários = (ArrayList)documento.getProperty(COMMENTS_KEY); |
No aplicativo de exemplo, armazenei um conjunto de comentários como uma matriz de strings. Você ainda precisa extrair a matriz com base em uma chave, mas, a partir daí, pode tratá-la como uma lista.
Um toque a mais de sofisticação
Para aplicativos mais sofisticados, talvez você queira converter seus documentos totalmente em objetos.
Há várias bibliotecas disponíveis para converter JSON de/para objetos Java. As APIs padrão do Android para lidar com JSON têm algumas limitações reais, mas elas são integradas, o que é uma vantagem. O Google tem uma biblioteca, Gson. Gson pode lidar com casos em que você não tem acesso à fonte. Achei interessante ler a seção Documento de design da Gson para obter insights mais profundos sobre outras considerações ao lidar com JSON.
Nesta postagem, falarei sobre outra biblioteca JSON popular, Jackson. Jackson é bastante maduro, oferece suporte a três abordagens diferentes para lidar com JSON e tem uma forte reputação de eficiência.
Vinculação de dados
Leia os detalhes sobre os três modos para Jackson aqui se você quiser. A maioria dos desenvolvedores de aplicativos provavelmente desejará usar o vinculação de dados abordagem. Talvez isso pareça um pouco intimidador, mas na verdade não é. A vinculação de dados aqui se refere apenas à correspondência do JSON com as propriedades de um objeto de alguma forma automatizada.
Por exemplo, a vinculação de dados significa fazer o seguinte
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
{ "id": "contact100", "tipo": "contato", "first_name": "John", "last_name": "Smith", "email": "john.smith@couchbase.com", "endereços": [ { "address_line": "123 Main Street" (Rua Principal 123), "cidade": "Vista da montanha", "país": "EUA" }, { "address_line": "123 Market" (Mercado 123), "cidade": "São Francisco", "país": "EUA" } ] } |
e usá-lo para criar uma instância deste
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
público classe Contato { público Cordas id; público Cordas tipo; público Cordas primeiro_nome; público Cordas sobrenome; público Cordas e-mail; público Endereço[] endereços; público estático classe Endereço { público Cordas linha_de_endereço; público Cordas cidade; público Cordas país; } } |
Jackson é muito bom em descobrir como fazer isso sem ajuda. Como os campos acima são todos declarados públicos, não há mais nada a fazer. Supondo que os dados JSON estejam em um arquivo Mapa
chamado "map", esse snippet preencherá o arquivo a Contato
instância.
1 |
Contato contato = mapeador.convertValue(mapa, Contato.classe); |
Se o JSON acima representar os dados em um documento do Couchbase, o código seria algo como isto.
1 |
Contato contato = mapeador.convertValue(documento.getProperties(), Contato.classe); |
Isso funciona se os campos não forem públicos e se houver getters e setters correspondentes.
Uma pequena ajuda: Anotações
Por fim, você pode ter um controle realmente refinado da construção do objeto usando Annotations. As anotações da Jackson são poderosas. Uma descrição completa está além do escopo deste blog. Você pode ler um bom guia que as descreve aqui.
POJO (Plain Old Java Objects)1
Para ajudar no uso das Anotações, achei útil começar com uma classe base. Aqui está o código.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
@JsonInclude(Incluir.NON_NULL) público classe POJO { @JsonIgnore privado Mapa<Cordas, Objeto> additionalProperties = novo HashMap<>(); @JsonAnyGetter público Mapa<Cordas, Objeto> getAdditionalProperties() { retorno este.additionalProperties; } @JsonAnySetter público vazio setAdditionalProperty(Cordas nome, Objeto valor) { este.additionalProperties.colocar(nome, valor); } } |
A primeira anotação @JsonInclude(Include.NON_NULL)
instrui Jackson a ignorar os campos nulos (ou seja, coisas que estão faltando nos dados).
As próximas três anotações, juntamente com o código, permitem que a Jackson manipule quaisquer campos não especificados. A Jackson preencherá alegremente qualquer coisa que você não tenha informado no mapa additionalProperties. Isso significa que você pode alterar os dados sem se preocupar com a possibilidade de o código explodir. Não é preciso dizer que isso pode permitir que erros reais passem despercebidos, portanto, use com cautela!
Por fim, caso você queira evitar fazer isso sozinho, aqui está um link para uma ferramenta que pode ajudar a automatizar a anotação de classes: http://www.jsonschema2pojo.org/
Nota final
Atualmente, o Couchbase Lite usa o Jackson internamente. Muitas pessoas recomendariam não que dependem disso. Eu indico isso caso você se depare com conflitos de biblioteca ou outros problemas.
Pós-escrito
Confira mais recursos em nosso portal do desenvolvedor e nos siga no Twitter @CouchbaseDev. Você pode postar perguntas em nosso fóruns. E participamos ativamente de Estouro de pilha.
Você pode me seguir pessoalmente em @HodGreeley