【问题标题】:Firebase database increment an intFirebase 数据库增加一个 int
【发布时间】:2016-11-03 15:15:18
【问题描述】:

为了在我的数据库中增加一个 int 值,我首先使用侦听器获取该值,将其增加 1,然后将新值设置为数据库。这可行,但我想知道是否有更简单的方法可以做到这一点。这种方式似乎工作量太大。

【问题讨论】:

标签: android firebase firebase-realtime-database


【解决方案1】:

更新:自 2020 年初以来,实际上一个服务器端操作来增加实时数据库中的值。请参阅 dfeverx's answer 对此,或我自己的 Q&A 比较事务和增量之间的性能:How quickly can you atomically increment a value on the Firebase Realtime Database?


没有服务器端方法可以在 Firebase 数据库中增加值(或进行其他计算)。

您的方法是这样做的一种方式,但它有可能导致竞争条件。

  1. 数据库中的值为12
  2. 客户端1读取值12
  3. 客户端 2 读取值 12
  4. 客户端 1 写入其增量值 13
  5. 客户端 2 写入其增量值 13

结果现在可能不正确(这取决于您的用例)。

在这种情况下,使其工作的一种方法是使用 Firebase 事务,它将读取和写入组合到一个函数中。

Firebase Database documentation 中涵盖了交易。我强烈推荐阅读它。在那里度过几个小时将防止许多问题发生。来自文档:

postRef.runTransaction(new Transaction.Handler() {
    @Override
    public Transaction.Result doTransaction(MutableData mutableData) {
        Long value = mutableData.getValue(Long.class);
        if (value == null) {
            mutableData.setValue(0);
        }
        else {
            mutableData.setValue(value + 1);
        }

        return Transaction.success(mutableData);
    }

    @Override
    public void onComplete(DatabaseError databaseError, boolean b,
                           DataSnapshot dataSnapshot) {
        Log.d(TAG, "transaction:onComplete:" + databaseError);
    }
});

【讨论】:

    【解决方案2】:

    从 firebase JavaScript SDK v7.14.0 开始,您可以使用 ServerValue.increment() 在firebase中增加价值

    方法一

    var userRef= firebase.database().ref("user/user_id_123");
    userRef.push({
      likes: firebase.database.ServerValue.increment(1)
    });
    

    方法二

    firebase.database()
        .ref('user')
        .child('user_id_123')
        .child('likes')
        .set(firebase.database.ServerValue.increment(1))
    

    您也可以将浮点或负值传递给增量函数

    你可以在这里找到参考:https://firebase.google.com/docs/reference/js/v8/firebase.database.ServerValue

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-31
      相关资源
      最近更新 更多