为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

温温酱 2019-11-20 14:38:02
我正在尝试使用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) {    }});当我在应用程序中按一个按钮时,此代码被激活。自启动应用程序以来第一次按下按钮时,我的数据库不变。但是,自启动应用程序以来,当我第二次按下按钮时,它将更新为下一个数字。我不明白这是什么问题,或者为什么只在第二次按下按钮时才这样做。
查看完整描述

1 回答

?
慕娘9325324

TA贡献1783条经验 获得超4个赞

您将要遵循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()。


查看完整回答
反对 回复 2019-11-20
  • 1 回答
  • 0 关注
  • 337 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信