
我正在尝试使用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) { }});当我在我的应用程序中按下按钮时,此代码被激活.当我启动应用程序后第一次按下按钮时,我的数据库不会更改.但是当我启动应用程序后第二次按下按钮时,它会将其更新为下一个数字.我不明白它是什么错误或为什么它只在第二次按下按钮时才会这样做.
解决方法:
您需要遵循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可能(通常会)多次执行您的事务回调,您需要满足这一要求.
>当您第一次调用runTransaction()时,Firebase客户端将立即调用您的doTransaction()回调及其当前数据的当前猜测.通常这将是null.
>您的代码根据当前值返回下一个值.在上面的情况中,如果当前值为null,则新值将为1.
> Firebase客户端然后将假定的当前值和新值发送到服务器.
>如果实际存储的值与假定的当前值相同,Firebase服务器将写入您指定的新值.
>如果实际存储的值与假定的当前值不同,Firebase服务器将拒绝新值并将实际当前值发送到客户端.
>在此阶段,客户端返回步骤1,使用现在更新的假定当前值.
如果这不能解释您所看到的行为,则可能需要检查传递给onComplete()的值.
总结以上是内存溢出为你收集整理的android – Firebase runTransaction不工作 – MutableData为null全部内容,希望文章能够帮你解决android – Firebase runTransaction不工作 – MutableData为null所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)