Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Firestore Android中增加事务中的计数器?_Java_Android_Firebase_Google Cloud Firestore - Fatal编程技术网

Java 如何在Firestore Android中增加事务中的计数器?

Java 如何在Firestore Android中增加事务中的计数器?,java,android,firebase,google-cloud-firestore,Java,Android,Firebase,Google Cloud Firestore,下面是一个与Firebase Android文档相同的事务示例 但是代码执行了很多次,使计数器递增几次,但只需递增一次 final DocumentReference produtosRef = db.collection("Produtos").document(produtoSelecionado.getKey()); db.runTransaction(new Transaction.Function<Void>() { @Override

下面是一个与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);
                }
            });
final DocumentReference produtsref=db.collection(“Produtos”).document(produtoSelecionado.getKey());
db.runTransaction(new Transaction.Function(){
@凌驾
public Void apply(事务处理)引发FirebaseFirestoreException{
DocumentSnapshot snapshot=transaction.get(produtsref);
if(snapshot.exists()){
Produto-Produto=snapshot.toObject(Produto.class);
String key=snapshot.getId();
Map childUpdates=newhashmap();
childUpdates.put(“quantidadeitentessetoque”,produto.getquantidadeitentessetoque()+compra_x_produto.getquantidadeecomprado());
childUpdates.put(“precoVenda”,compra_x_produto.getPrecoVendaProduto());
产品更新(儿童更新);
//成功
返回null;
}否则{
//最新产品更新
String key=snapshot.getId();
Map childUpdates=newhashmap();
childUpdates.put(“quantidadeitentenstoque”,compra_x_produto.getQuantidadeComprado());
childUpdates.put(“precoVenda”,compra_x_produto.getPrecoVendaProduto());
产品更新(儿童更新);
LoadingUtil.hideLoading();
//成功
返回null;
}
}
}).addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公开作废(作废避免){
Log.d(标记“事务成功!”);
}
})
.addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
Log.w(标记“事务失败”,e);
}
});

在Cloud Firestore数据库中,无需使用事务来增加计数器。您可以使用FieldValue的方法递增计数器,这将帮助您以原子方式递增值:

FieldValue.increment(yourNumber);
返回一个特殊值,该值可与set()或update()一起使用,该值告诉服务器按给定值递增字段的当前值


“代码执行了很多次”多少次?嗨,乔西亚斯!你试过我上面的方法吗?如果你认为我的答案对你有帮助,请考虑通过点击复选来接受它。✔️) 在投票箭头下方的左侧。应该将颜色改为绿色。我很感激。谢谢!这并不能回答问题。如果事务没有在文档中读取正在递增的字段,这也没有帮助。@DannyDulai,因为OP只希望递增一个值,一次到服务器的往返,以执行递增操作无论如何,在这种情况下都不需要事务。它实际上用一个只需要一行代码的解决方案来回答问题。除此之外,不需要先读取值来增加它,因此这是一个更简单的解决方案。这就是Firebase团队实现此功能的原因,以简化事情。我希望您重新考虑我的建议回答并收回否决票。我非常感谢。谢谢你为所问问题提供了一个替代方案,但没有回答原始问题。你的回答可能是问题的解决方案,但它没有回答问题。我个人有一种情况,我想用一个事务更新两个文档,但我不想这样做为了增加阅读量,我不得不进行阅读往返。不回答这个问题,你就降低了这个问题对未来读者的有用性。现在我被要求以相同的标题再次提问。到目前为止,似乎没有办法做我想做的事,这是一个很好的答案。@AnkitMishra是的,会的。这是一个原子操作。