Как увеличить счетчик при транзакции в Firestore Android? - PullRequest
0 голосов
/ 09 апреля 2019

Я следую примеру транзакций, идентичных документации Firebase Android.

Но код выполняется многократно, счетчик увеличивается на несколько раз, но должен увеличиваться только один раз.

final DocumentReference produtosRef = db.collection("Produtos").document(produtoSelecionado.getKey());

    db.runTransaction(new Transaction.Function<Void>() {
        @Override
        public Void apply(Transaction transaction) throws FirebaseFirestoreException {
            DocumentSnapshot snapshot = transaction.get(produtosRef);
            if(snapshot.exists()){
                Produto produto = snapshot.toObject(Produto.class);
                String key = snapshot.getId();
                Map<String, Object> childUpdates = new HashMap<>();
                childUpdates.put("quantidadeItensEstoque",produto.getQuantidadeItensEstoque() + compra_x_produto.getQuantidadeComprado());
                childUpdates.put("precoVenda", compra_x_produto.getPrecoVendaProduto());
                produtosRef.update(childUpdates);
                // Success
                return null;
            }else{
                // se nao tiver nenhum item ainda desse produto so faz o update
                String key = snapshot.getId();
                Map<String, Object> childUpdates = new HashMap<>();
                childUpdates.put("quantidadeItensEstoque",  compra_x_produto.getQuantidadeComprado());
                childUpdates.put("precoVenda", compra_x_produto.getPrecoVendaProduto());

                produtosRef.update(childUpdates);
                LoadingUtil.hideLoading();
                // Success
                return null;
            }
        }
    }).addOnSuccessListener(new OnSuccessListener<Void>() {
        @Override
        public void onSuccess(Void aVoid) {
            Log.d(TAG, "Transaction success!");
        }
    })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Log.w(TAG, "Transaction failure.", e);
                }
            });

1 Ответ

1 голос
/ 11 апреля 2019

Нет необходимости использовать транзакцию для увеличения счетчика в базе данных Cloud Firestore.Вы можете увеличить свой счетчик с помощью метода increment () FieldValue, который поможет вам увеличить значения атомарно:

FieldValue.increment(yourNumber);

Возвращает специальное значение, которое можно использовать сset () или update (), который указывает серверу увеличивать текущее значение поля на заданное значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...