Firebase数据库增加一个int

1 android firebase firebase-realtime-database

为了增加数据库中的int值,我首先使用一个侦听器获取该值,将其递增1,然后将新值设置为database.这有效,但我想知道是否有更简单的方法.这种方式似乎太多了.

Fra*_*len 13

在Firebase数据库中没有增加值(或执行其他计算)的服务器端方法.

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

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

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

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

Firebase数据库文档中介绍了事务.我强烈建议阅读它.花几个小时就可以防止出现许多问题.来自文档:

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);
    }
});
Run Code Online (Sandbox Code Playgroud)


d-f*_*erx 13

从 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)
});
Run Code Online (Sandbox Code Playgroud)

方法二

firebase.database()
    .ref('user')
    .child('user_id_123')
    .child('likes')
    .set(firebase.database.ServerValue.increment(1))
Run Code Online (Sandbox Code Playgroud)

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