Firebase runTransaction无法正常工作-MutableData为null

我正在尝试使用runTransaction()Firebase数据库,但无法正常工作。这是我正在使用的代码。


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) {



    }

});

当我在应用程序中按一个按钮时,此代码被激活。自启动应用程序以来第一次按下按钮时,我的数据库不变。但是,自启动应用程序以来,当我第二次按下按钮时,它将更新为下一个数字。我不明白这是什么问题,或者为什么只在第二次按下按钮时才这样做。


温温酱
浏览 338回答 1
1回答

慕娘9325324

您将要遵循Firebase文档中用于处理事务的模式,并处理事务回调没有当前值的情况: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可能(并且经常会)多次执行事务回调,而您需要为此做些准备。首次调用时runTransaction(),Firebase客户端将立即doTransaction()使用其对当前数据的当前猜测来调用您的回调。通常会这样null。您的代码根据当前值返回下一个值。在上述情况下,如果当前值为null新值,则将为1。然后,Firebase客户端会将假定的当前值和新值发送到服务器。如果实际存储的值与假定的当前值相同,则Firebase服务器将写入您指定的新值。如果实际存储的值与假定的当前值不同,则Firebase服务器将拒绝新值,并将实际的当前值发送给客户端。在此阶段,客户端返回到步骤1,使用现在更新的假定当前值。如果这不能解释您所看到的行为,则可能需要检查将哪些值传递给onComplete()。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Android