有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

安卓 Firebase runTransaction不工作MutableData为空

我正在尝试使用Firebase数据库的runTransaction(),但它不起作用。这是我正在使用的代码

numQuestionRef.runTransaction(new Transaction.Handler() {
    @Override
    public Transaction.Result doTransaction(MutableData mutableData) {
        String numQuestions = (String) mutableData.getValue();
        long value = Long.parseLong(numQuestions, 16);
        value++;
        String incHex = Long.toHexString(value);
        mutableData.setValue(incHex);
        return Transaction.success(mutableData);
    }

    @Override
    public void onComplete(FirebaseError firebaseError, boolean b, DataSnapshot dataSnapshot) {


    }
});

当我按下应用程序中的一个按钮时,此代码被激活。当我启动应用程序后第一次按下按钮时,我的数据库没有改变。但当我启动应用程序后第二次按下按钮时,它会更新到下一个数字。我不明白它出了什么问题,也不明白它为什么只在第二次按下按钮时才会这样做


共 (1) 个答案

  1. # 1 楼答案

    您需要遵循Firebase documentation for handling transactions中使用的模式,处理事务回调中没有当前值的情况:

    public Transaction.Result doTransaction(MutableData currentData) {
        long value = 0;
        if(currentData.getValue() != null) {
            String numQuestions = (String) currentData.getValue();
            value = Long.parseLong(numQuestions, 16);
        }
        value++;
        String incHex = Long.toHexString(value);
        currentData.setValue(incHex);
        return Transaction.success(currentData);
    }
    

    您需要这样做的原因是Firebase可能(而且通常会)多次执行事务回调,您需要满足这一点

    1. 当您第一次调用runTransaction()时,Firebase客户端将立即调用您的doTransaction()回调,并对当前数据进行当前猜测。这通常是null
    2. 代码基于当前值返回下一个值。在上述情况下,如果当前值为null,则新值将为1
    3. Firebase客户端然后将假定的当前值和新值发送到服务器
    4. 如果实际存储值与假定的当前值相同,Firebase服务器将写入您指定的新值
    5. 如果实际存储的值与假定的当前值不同,Firebase服务器将拒绝新值,并将实际当前值发送给客户端
    6. 在这个阶段,客户机返回到步骤1,使用现在更新的假定当前值

    如果这不能解释您看到的行为,您可能需要检查哪些值被传递到onComplete()