Cópia do rascunho original da partitura de Handel
Foto cortesia de Adrian Pallant com permissão sob licença CC BY-SA 2.0
O U em CRUD
Em este Em um post anterior, escrevi sobre como começar a usar operações CRUD básicas em Couchbase Lite no Android. Nesta nota rápida, quero me aprofundar um pouco mais na atualização de documentos. Isso abrirá a porta para um conjunto totalmente novo de problemas. Vamos dar uma olhada.
O Couchbase Lite é um banco de dados orientado a documentos. Os documentos são armazenados como JSON objetos. Conforme descrito na postagem anterior, é fácil trabalhar diretamente com o conteúdo do documento. Eles são armazenados no objeto do documento como um mapa. Isso se encaixa perfeitamente nas formas nativas de manipular o conteúdo.
Ajustando a abordagem direta
Quando você recupera um documento, obtém uma cópia que contém uma versão imutável dos dados. Você pode lidar com isso copiando o mapa em um objeto map separado e, em seguida, substituindo o mapa antigo. Isso é mostrado neste trecho de código:
1 2 3 4 5 6 7 8 9 |
perfil = novo HashMap(); perfil.putAll(documento.getProperties()); perfil.colocar("tipo", "profile" (perfil)); // Adicionar um "tipo" ao documento tentar { documento.putProperties(perfil); } captura (CouchbaseLiteException ex) { Registro.e(TAG, "Falha na operação do CBL"); } |
Na verdade, isso cria um novo revisão do documento, usando o novo corpo do documento.
Como alternativa, você pode usar createRevision()
para obter um novo UnsavedRevision
. Isso retorna uma cópia da última revisão, mas com conteúdo mutável. Assim, você pode manipular diretamente o mapa de propriedades. As alterações são confirmadas chamando salvar()
. Esse trecho de código tem o mesmo efeito final que o anterior:
1 2 3 4 5 6 7 8 9 |
UnsavedRevision atualização = documento.createRevision(); perfil = atualização.getProperties(); perfil.colocar("tipo", "profile" (perfil)); // Adicionar um "tipo" ao documento tentar { atualização.salvar(); } captura (CouchbaseLiteException ex) { Registro.e(TAG, "Falha na operação do CBL"); } |
Revisões, você diz?
Isso é ótimo para muitos aplicativos. Ainda não falei muito sobre revisões. Você tem a ideia de que um documento está mudando. O Couchbase Lite tem uma noção de revisões de documentos para acompanhar essas alterações.
No entanto, as revisões são mais profundas do que apenas rastrear um conjunto linear de alterações. O que não salta aos olhos em exemplos como os que mostrei é a possibilidade de conflitos. Os conflitos ocorrem quando mais de uma atualização de uma revisão específica do documento é confirmada no banco de dados.
Pense nisso como se fosse um documento do mundo real. Talvez você escreva um artigo (ou uma postagem de blog!) e o envie para várias pessoas para receber comentários. Você recebe um conjunto de comentários e faz algumas alterações. Em seguida, outro conjunto de comentários retorna, com base no mesmo documento original. Faça isso com frequência suficiente e é quase certo que você chegará a um caso em que algumas alterações se sobrepõem. (Bem, para os desenvolvedores de software, provavelmente o melhor exemplo são os conflitos de mesclagem ao usar o controle de origem). Conflito!
Atualizador de documentos
Lidar com conflitos de documentos, histórico de revisões e assim por diante é mais do que eu gostaria de abordar neste post. Mas podemos ter uma ideia de como o Couchbase ajuda. Essa última abordagem de atualização pode parecer um exagero, mas você passará a apreciá-la quando a resolução de conflitos entrar em ação. Aqui está o código:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
documento = banco de dados.getDocument(documentId); tentar { documento.atualização(novo Documento.Atualizador de documentos() { @Substituir público booleano atualização(UnsavedRevision newRevision) { Mapa propriedades = newRevision.getUserProperties(); propriedades.colocar("tipo", "profile" (perfil)); newRevision.setUserProperties(propriedades); retorno verdadeiro; } }); } captura (CouchbaseLiteException ex) { Registro.e(TAG, "Falha na operação do CBL"); } |
Uau, isso parece muito mais complexo do que os exemplos anteriores. Na verdade, é apenas um pouco mais complicado. Essa estrutura adicional acaba tornando a vida muito mais fácil. Então, o que está acontecendo?
Essa construção permite que o Couchbase Lite lide com o trabalho grunge de lidar com conflitos. Você define um retorno de chamada com base no Atualizador de documentos
interface. O Couchbase Lite se encarregará de criar um novo UnsavedRevision
como no exemplo anterior. Seu método precisa, então, fazer as alterações que você deseja. Ao retornar, o Couchbase Lite tenta automaticamente salvar o documento. Se ele detectar um conflito O Couchbase Lite simplesmente chama update()
novamente. Retorno verdadeiro
se você tiver feito alterações que deseja salvar, ou falso
caso contrário.
Se quiser saber mais sobre revisões, colisões e resolução de conflitos, dê uma olhada em nosso guia aqui
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
... [Trackback]
[...] Leia mais: http://www.couchbase.com/better-updates-couchbase-lite/ […]
[...] Então, em resumo, temos um exemplo de criação e atualização de documentos. Essa não é a maneira preferida de atualizar, embora seja suficiente em muitos casos. Você pode ler mais sobre atualizações aqui. [...]