我正在尝试使用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) {
}
});
当我在应用程序中按下一个按钮时,这段代码就会被激活。当我在启动应用程序后第一次按下按钮时,我的数据库不会改变。但是当我第二次按下这个按钮时,它会把它更新到下一个号码。我不明白它有什么错,也不明白为什么它只在第二个按钮上按下。
发布于 2016-03-05 11:53:01
您需要遵循用于处理事务的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
。如果这不能解释您所看到的行为,您可能需要检查哪些值被传递到onComplete()
中。
https://stackoverflow.com/questions/35818946
复制相似问题