1 回答

TA貢獻1783條經(jīng)驗 獲得超4個贊
您將要遵循Firebase文檔中用于處理事務(wù)的模式,并處理事務(wù)回調(diào)沒有當(dāng)前值的情況:
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);
}
您需要執(zhí)行此操作的原因是Firebase可能(并且經(jīng)常會)多次執(zhí)行事務(wù)回調(diào),而您需要為此做些準(zhǔn)備。
首次調(diào)用時runTransaction(),F(xiàn)irebase客戶端將立即doTransaction()使用其對當(dāng)前數(shù)據(jù)的當(dāng)前猜測來調(diào)用您的回調(diào)。通常會這樣null。
您的代碼根據(jù)當(dāng)前值返回下一個值。在上述情況下,如果當(dāng)前值為null新值,則將為1。
然后,F(xiàn)irebase客戶端會將假定的當(dāng)前值和新值發(fā)送到服務(wù)器。
如果實際存儲的值與假定的當(dāng)前值相同,則Firebase服務(wù)器將寫入您指定的新值。
如果實際存儲的值與假定的當(dāng)前值不同,則Firebase服務(wù)器將拒絕新值,并將實際的當(dāng)前值發(fā)送給客戶端。
在此階段,客戶端返回到步驟1,使用現(xiàn)在更新的假定當(dāng)前值。
如果這不能解釋您所看到的行為,則可能需要檢查將哪些值傳遞給onComplete()。
- 1 回答
- 0 關(guān)注
- 367 瀏覽
添加回答
舉報