如何在 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