如何在 Firebase 中使用离线用户更新库存?

Posted

技术标签:

【中文标题】如何在 Firebase 中使用离线用户更新库存?【英文标题】:How to update an inventory with offline users in Firebase? 【发布时间】:2021-01-06 08:09:12 【问题描述】:

Firebase:如何使用离线用户更新库存?

我有一个使用 Flutter 和 Firebase 构建的 Agro 应用程序。该应用程序的工作原理如下:

    您的仓库中有食品库存 用户在离线模式下外出喂动物(他们在农场) 然后它们返回并根据 Firebase 的 Offline 属性执行数据库写入

当用户在喂食时在线时,一切正常,但是在离线模式下喂食时,我遇到了专门更新库存的问题,因为离线用户缓存的库存可能与真实库存不同(或者因为新食物已经引入或由于其他用户的在线更新)。

我将数据写入 Firebase 的方式(使用 BLOC 模式)如下:

  Future<bool> actualizarCantidad(String idAlimento, double cantidadActualizada) async 
  try 
      db.child('alimento/$idAlimento').update( "cantidad": cantidadActualizada);
     catch (e) 
      print(e);
    
    return true;
  

读取库存和排序数据库更新的函数如下:

Future<void> _submit() async 

    _alimento = await alimentoBloc.cargarAlimento(alimentar.idAlimento); 
    //To read the inventory for the specific food type (alimentar.idAlimento)

    final _cantAlimento = _alimento.cantidad - _consumoTotal; 
    //_alimento.cantidad is refered to the inventory
    //_consumoTotal is the quantity to reduce (eaten food)

    _alimentoBloc.actualizarCantidad(alimentar.idAlimento, _cantAlimento);
    //Use the BLOC and PROVIDER pattern to Update the Inventory with a new Quantity (_cantAlimento)

我想在 Firebase 中做的是,不是将 _cantAlimento 数量分配给 Inventory,而是执行“减少 Inventory 中数量的 _consumoTotal”之类的操作,这样用户是离线还是在线都无关紧要。这可能吗?

我审查过的另一种选择是使用事务来确保您使用的是最新数据,但是当用户离线时事务会丢失,因此这是不可能的。

考虑到我的用户经常离线,我如何才能以正确的方式更新库存?

【问题讨论】:

【参考方案1】:

自几个月前以来,Firebase 实时数据库支持 ServerValue.increment() 操作,可用于自动增加/减少数据库中的值,即使客户端未连接到服务器也是如此。

这个新方法也刚刚登陆 FlutterFire firebase_database 插件的 ServerValue class 的 4.1 版本。如果您对此有任何疑问,我会提交错误或在feature request 上发表评论。

【讨论】:

看起来很棒!!!我现在可以使用此方法吗?我需要等待吗?您认为需要多长时间? 嘿@DavidL increment() 操作刚刚在firebase_database 插件的4.1 版中发布。 嗨@puf。我可以实施新的操作,它现在工作正常......这是一个很好的解决方案。一个问题:它只支持整数,我的数量变量是双精度数。我说的对吗? 嗯...我实际上从未用非整数测试过。如果我真的想要一个浮点值,我倾向于只存储双精度值。如果我想存储分数,我发现以较小的单位存储值会更好,以防止出现舍入问题。假设您要存储剩余 62½ 盒东西,将其视为6250,它允许您存储 1/100 盒。这是一个。存储货币时非常常见的做法,但它也适用于许多其他场景。【参考方案2】:

根据@puf 的回答,使用 ServerValue.increment() 更新 Firebase 中的库存或数字的过程如下:

  db.child('alimento/$idAlimento/cantidad')
    .set(ServerValue.increment(-consumo.round()));

需要注意的是,ServerValue.increment() 只支持整数(直到现在,它还不支持双精度数)。如果你有一个双数,你应该把它四舍五入,你可以尝试使用一个更小的单位(在我的例子中是 grs 而不是 Kgs)。

【讨论】:

以上是关于如何在 Firebase 中使用离线用户更新库存?的主要内容,如果未能解决你的问题,请参考以下文章

Firebase A/B 测试离线行为

如何在用户离线时尝试将数据添加/上传到 Firebase 时显示错误?

如何缓存 Firebase 数据以供离线使用?

如何使用 SwiftUI 更新 Firebase 中的集合?

Firebase 离线支持:在用户离线时上传帖子,当用户在 iOS Swift 应用程序中在线时同步

应用离线时如何绕过 Firebase 身份验证?