如何将If语句放入交易Firebase Firestore中

时间:2019-08-04 08:41:32

标签: java android firebase transactions google-cloud-firestore

当用户单击按钮时,它将检查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发生了什么,它没有显示任何错误,请告诉我是我做错了还是还有另一种方法。

2 个答案:

答案 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只是一个变量名。