Firebase数据库增加一个int

时间:2016-11-03 15:15:19

标签: android firebase firebase-realtime-database

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

2 个答案:

答案 0 :(得分:11)

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

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

  1. 数据库中的值为12
  2. 客户端1读取值12
  3. 客户端2读取值12
  4. 客户端1写入其递增值13
  5. 客户端2写入其递增值13
  6. 结果现在可能不正确(取决于您的用例)。

    在这种情况下,使其工作的一种方法是使用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);
        }
    });
    

答案 1 :(得分:8)

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

方法1

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

方法2

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

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