2016-11-03 9 views
0

データベースのint値をインクリメントするには、まずリスナを使用してその値を取得し、1ずつインクリメントしてから、新しい値をdatabaseに設定します。これはうまくいきますが、もっと簡単な方法があるかどうかを知りたいのです。この方法はあまりにも多くの作業のようです。Firebaseデータベースのインクリメントint

+1

これはあなたのコードを記述しますが、[この問題を再現する最小限のコード](http://stackoverflow.com/help/mcve)を共有しないでください –

+3

を移動するための方法です。 –

答えて

5

Firebaseデータベースに値をインクリメント(または他の計算を行う)するサーバ側の方法はありません。

あなたのアプローチはこれを行う方法の1つですが、競合状態に陥る可能性があります。

  1. データベースの値は12
  2. クライアント1である値12
  3. クライアント2 12
  4. クライアント1 13
  5. クライアント2は、そのインクリメントされた値を書き込み、そのインクリメントされた値を書き込む値を読み出す読み出し13

結果が正しくない可能性があります(使用するケースによって異なります)。

その場合、動作させる1つの方法は、読み取りと書き込みを1つの機能にまとめた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); 
    } 
}); 
関連する問題