1 回答
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()。
- 1 回答
- 0 关注
- 337 浏览
添加回答
举报