【问题标题】:How to detect a negative integer in firebase?如何检测firebase中的负整数?
【发布时间】:2021-01-24 12:46:43
【问题描述】:

我在 Flutter 中使用 ServerValue.increment 来更新 Firebase 中的库存量。当我的用户离线时,这是一个很好的解决方案,但我需要修复以下情况:

  1. 用户 1 读取 40 的库存(示例)并立即下线
  2. 用户2读取相同的库存(40)并花费10,然后在线库存更新为30
  3. 用户 1 花费 35(小于 40)。当他/她再次上线时,库存将更新为 -5 (30 - 35)

我想检测这个负数来执行一个程序。如何在 Firebase 中检测到它?

我以这种方式使用 ServerValue.increment:

db.child('quantityInStock')
    .set(ServerValue.increment(-quantityToReduce.round()));

如何检测 quantityInStock 何时最终为负数以便自动执行新程序?

【问题讨论】:

    标签: flutter firebase-realtime-database


    【解决方案1】:

    如果新值依赖于您描述的现有值,您有两种选择:

    1. 使用安全规则确保只有在有足够库存时才允许写入操作。

      ".write": "newData.val() >= 0"
      
    2. 使用事务确保您的客户可以主动检查当前值,以确定新值。

      dataRef.runTransaction((MutableData transaction) async{
        if (transaction.value >= 40) {
          transaction.value = transaction.value - 40;
        }
        return transaction;
      });
      

    这两种方法各有优缺点。

    例如:在离线用户的场景中使用安全规则可能会阻止您的应用程序代码知道写入被拒绝,因为完成侦听器不会在应用程序重新启动时保持不变。

    使用事务您不会遇到这个问题,但在这种情况下,您的应用只有在用户连接到数据库时才能运行。用户离线时,事务不起作用。

    【讨论】:

    • 谢谢@puf。我需要与离线用户合作,那么我认为第一种方法更好。那么,如果我实施安全规则,当用户重新上线并且写入被拒绝时,我该如何执行操作?我的意思是……如果(由于库存不足,写入被拒绝){然后将库存设置为 0 并对缺少的数量(-5)进行处理}
    • 如前所述:您可以附加一个完成侦听器来捕获写入结果,但完成侦听器不会在应用重新启动时持续存在。老实说:由于您想根据数据库中的实际值执行不同的写入,我更倾向于将其映射到事务。
    • 替代方案:不要让客户端直接更新数量,而是让它将其变异写入数据库。所以:客户写了一条记录,说它想从某种类型中获取 40 个项目,然后你有一个 Cloud Function 处理这些记录。
    • 嗯...我如何评估这个替代方案?
    猜你喜欢
    • 2017-02-04
    • 2012-11-25
    • 2011-06-09
    • 2011-09-02
    • 1970-01-01
    • 2013-03-20
    • 2011-12-02
    • 1970-01-01
    相关资源
    最近更新 更多