Как увеличить счетчик в транзакции в Firestore Android?

#java #android #firebase #google-cloud-firestore

#java #Android #firebase #google-облако-firestore

Вопрос:

Я следую примеру транзакций, идентичных документации 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:

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

 FieldValue.increment(yourNumber);
  

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

Комментарии:

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

2. Вы указали альтернативу заданному вопросу, но не ответили на исходный вопрос. Ваш ответ может быть решением проблемы, но он не отвечает на вопрос. У меня лично есть ситуация, когда я хочу обновить 2 документа с помощью транзакции, но я бы предпочел не выполнять цикл чтения туда и обратно только для увеличения. Не ответив на вопрос, вы сделали его менее полезным для будущих читателей. Теперь я должен задать еще раз с тем же названием. Кажется, на данный момент нет способа сделать то, что я хочу, что является прекрасным ответом на вопрос.

3. увеличение будет работать в случае, когда, возможно, тысячи пользователей увеличивают одно и то же значение в firestore. В идеале я просто хочу, чтобы счетчик увеличивался до тысячи, поскольку тысячи пользователей пытаются его увеличить. Будет ли это работать таким образом?

4. @AnkitMishra Да, так и будет. Это атомарная операция.