我下面是一个与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);
}
});
无需使用事务来递增 Cloud Firestore 数据库中的计数器。您可以使用 FieldValue 的 increment(( 方法递增计数器,这将帮助您以原子方式递增值:
FieldValue.increment(yourNumber);
返回一个特殊值,该值可与 set(( 或 update(( 一起使用,该值告诉服务器将字段的当前值递增给定值。