当用户单击按钮时,它将检查Firestore中的Document是否存在,如果存在,则只需更新(增加)某个值,如果它没有使用新值创建新文档。
我可以只执行普通的documentRef.get()
和documentRef.set()
,但是当我由2位用户进行测试时,请同时按下按钮。它只是把其中之一的新价值。所以我用了交易。
在此事务中,首先我得到文档快照,然后得到值。 然后我放if语句来检查文档是否存在,第一个语句是document是否存在可以正常工作,但是当我删除文档时,else语句diddnt不会做任何事情。
是否甚至可以在Firebase Firestore事务中使用if语句?
Map<String, Object> newDocumentSet = new HashMap<>();
newDocumentSet.put("sold", 1);
newDocumentSet.put("price", myProductPrice);
mDb.runTransaction(new Transaction.Function<Void>() {
@Nullable
@Override
public Void apply(@NonNull Transaction transaction) throws FirebaseFirestoreException {
DocumentSnapshot myDocumentSnapshot = transaction.get(myDocumentRef);
long newAddSold = myDocumentSnapshot.getLong("sold") + 1;
long newAddPrice = myDocumentSnapshot.getLong("price") + myProductPrice;
if(myDocumentSnapshot.exists()){
transaction.update(myDocumentRef, "sold", newAddSold);
transaction.update(myDocumentRef, "price", newAddPrice);
}else {
transaction.set(myDocumentRef, newDocumentSet);
}
return null;
}
});
idk发生了什么,它没有显示任何错误,请告诉我是我做错了还是还有另一种方法。
答案 0 :(得分:1)
或者还有另一种方法。
是的,甚至有一种更简单的方法,它实际上比事务处理更有效,因为它不需要需要客户端和Firebase服务器之间的往返。假设mDb
指向正确的文档,要将sold
属性增加1
,请使用以下代码行:
mDb.update("sold", FieldValue.increment(1));
答案 1 :(得分:0)
您需要做的就是从Map<String, dynamic>
函数返回一个runTransaction
值,并在run事务内确保您返回一个映射值,如
if (a) {
return "value":true
} else {
return "value":false
}
然后在函数的return语句中分配mapDynamic["value"];
。然后,您现在将执行代码的哪一部分。 mapDynamic只是一个变量名。