如何在 Firebase RTDB 中进行离线批处理?
How can I do an offline batch in Firebase RTDB?
我有理由相信某些 ServerValue.increment()
命令没有执行。
在我的应用程序中,当用户提交时,会执行两个命令:
Future<void> _submit() async {
alimentoBloc.descontarAlimento(foodId, quantity);
salidaAlimentoBloc.crearSalidaAlimento(salidaAlimento);
}
第一个命令更新仓库中剩余的库存量(使用ServerValue.increment)...
Future<bool> descontarAlimento(String foodId, int quantity) async {
try {
dbRef.child('inventory/$foodId/quantity')
.set(ServerValue.increment(-quantity));
} catch (e) {
print(e);
}
return true;
}
第二条命令制作食物输出寄存器,记录食物的数量、种类等关键数据。
Future<bool> crearSalidaAlimento(SalidaAlimentoModel salidaAlimento) async {
try {
dbRef.child('output')
.push().set(salidaAlimento.toJson());
} catch (e) {
print(e);
}
return true;
}
经过多次查看,我发现有时不执行增加命令,然后库存与应有的不对应。
然后,我想做一个类似事务的事情,就是:如果两个命令都没有执行,那么两个都不执行。
是否可以在不丢失离线功能的情况下在 Firebase Realtime 中执行一批命令?
您无法在设备离线时使用 transaction
。
他们需要检查数据库中的当前值,而这在离线时是不可能的。如果您想确保它们成功,您需要检查连接是否可用。
您可以执行多路径更新以事务方式执行两个写入:
var id = dbRef.push().key;
Map<String, dynamic> updates = {
"inventory/$foodId/quantity": ServerValue.increment(-quantity),
"output/$id": salidaAlimento.toJson()
}
dbRef.update(updates);
通过以上,要么两个写入都完成,要么都没有。
当您处于离线状态时,客户端将根据其对服务器当前值的最佳猜测触发本地事件(如果它从未读取该值,它将是 0
),并且它将然后在重新连接时将所有挂起的更改发送到服务器。如需快速测试,请参阅 https://jsbin.com/wuhuyih/2/edit?js,console
我有理由相信某些 ServerValue.increment()
命令没有执行。
在我的应用程序中,当用户提交时,会执行两个命令:
Future<void> _submit() async {
alimentoBloc.descontarAlimento(foodId, quantity);
salidaAlimentoBloc.crearSalidaAlimento(salidaAlimento);
}
第一个命令更新仓库中剩余的库存量(使用ServerValue.increment)...
Future<bool> descontarAlimento(String foodId, int quantity) async {
try {
dbRef.child('inventory/$foodId/quantity')
.set(ServerValue.increment(-quantity));
} catch (e) {
print(e);
}
return true;
}
第二条命令制作食物输出寄存器,记录食物的数量、种类等关键数据。
Future<bool> crearSalidaAlimento(SalidaAlimentoModel salidaAlimento) async {
try {
dbRef.child('output')
.push().set(salidaAlimento.toJson());
} catch (e) {
print(e);
}
return true;
}
经过多次查看,我发现有时不执行增加命令,然后库存与应有的不对应。
然后,我想做一个类似事务的事情,就是:如果两个命令都没有执行,那么两个都不执行。
是否可以在不丢失离线功能的情况下在 Firebase Realtime 中执行一批命令?
您无法在设备离线时使用 transaction
。
他们需要检查数据库中的当前值,而这在离线时是不可能的。如果您想确保它们成功,您需要检查连接是否可用。
您可以执行多路径更新以事务方式执行两个写入:
var id = dbRef.push().key;
Map<String, dynamic> updates = {
"inventory/$foodId/quantity": ServerValue.increment(-quantity),
"output/$id": salidaAlimento.toJson()
}
dbRef.update(updates);
通过以上,要么两个写入都完成,要么都没有。
当您处于离线状态时,客户端将根据其对服务器当前值的最佳猜测触发本地事件(如果它从未读取该值,它将是 0
),并且它将然后在重新连接时将所有挂起的更改发送到服务器。如需快速测试,请参阅 https://jsbin.com/wuhuyih/2/edit?js,console