我正在尝试使用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) {
}
});
Run Code Online (Sandbox Code Playgroud)
当我在我的应用程序中按下按钮时,此代码被激活.当我启动应用程序后第一次按下按钮时,我的数据库不会更改.但是当我启动应用程序后第二次按下按钮时,它会将其更新为下一个数字.我不明白它是什么错误或为什么它只在第二次按下按钮时才会这样做.
ATNRef= FirebaseDatabase.getInstance().getReference("AvailableTokenNumber");
ATNRef.runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(MutableData mutableData) {
if (mutableData.getValue(int.class ) == 0){
mutableData.setValue(2);
data.tokenNo = 1;
return Transaction.success(mutableData);
}else {
data.tokenNo=mutableData.getValue(int.class);
mutableData.setValue(data.tokenNo + 1);
return Transaction.success(mutableData);
}
}
Run Code Online (Sandbox Code Playgroud)
每当代码第一次运行时,data.tokenNo的值均为0。之后,它将根据数据库值正确更新。
我无法弄清楚是什么使每次应用程序/代码的首次运行时data.token = 0的值。
我的firebase看起来像这样:

这是测试代码(咖啡脚本):
Firebase = require 'firebase'
ref = new Firebase 'https://my_firebase.firebaseio.com/items'
ref.once 'child_added', (snapshot) ->
childRef = snapshot.ref()
console.log "child_added", childRef.toString(), snapshot.val()
childRef.transaction(
(data) ->
console.log 'transaction on data', data
return if !data or data.my_key isnt 'my_val'
data.my_key = 'new_val'
return data
,
(err, commited, snapshot) ->
if err
console.error 'error', err
return
console.log 'commited? '+commited
console.log 'server data', snapshot.val()
,
false
)
Run Code Online (Sandbox Code Playgroud)
并输出:
child_added https://my_firebase.firebaseio.com/items/item1 { my_key: 'my_val' }
transaction on data null
commited? false
server data null
Run Code Online (Sandbox Code Playgroud)
当第三个参数 …