web-dev-qa-db-ja.com

Firebaseで値を自動インクリメントする

AndroidクライアントからFirebaseに保存されている値を自動インクリメントするにはどうすればよいですか?

現在:_int id = 1_を宣言しています。インクリメントすると、値2、3などが格納されているのがわかります。それで問題ありませんが、プロジェクトを再実行すると、idが再び1に設定されます。

私はそれを静的変数のように動作させたいので、リセットせずに1から無限大になるidを作成できます。

更新失敗

以下を使用して、Firebase参照と文字列を関数incrementCounterに渡しました。

_if(language_chosen.equalsIgnoreCase("english"))
 {
   Firebase publRef = f.child("Language").child("English").child("Message");
   Firebase newPublRef = publRef.Push();
   writeMsgActivity demo = new writeMsgActivity();
   demo.incrementCounter(newPublRef,the_msg_enter);                                 
  }
_

次に、oncompleteメソッドのpublic void incrementCounter(Firebase publref,String my_msg)で渡された参照と文字列を使用しようとしましたが、エラーが発生します。

_   public void incrementCounter(Firebase publref,String my_msg) {
    publref.runTransaction(new Transaction.Handler() {
        @Override
        public Transaction.Result doTransaction(final MutableData currentData) {
            if (currentData.getValue() == null) {
                currentData.setValue(1);
            } else {
                currentData.setValue((Long) currentData.getValue() + 1);
            }

            return Transaction.success(currentData);
        }

        public void onComplete(FirebaseError firebaseError, boolean committed, DataSnapshot currentData) {
            if (firebaseError != null) {
                System.out.println("Firebase counter increment failed.");
            } else {
                System.out.println("Firebase counter increment succeeded.");

                Map<String, Object> publ = new HashMap<String, Object>();
                publ.put("pubMsg", my_msg);
                publ.put("id",currentData);
                publref.setValue(publ);
            }
        }
    });
}
_

更新済み

_                final Firebase upvoteref = new Firebase("https://shareurday.firebaseio.com/Message/"+msg_id+"/upvotes"); 

            upvoteref.runTransaction(new Transaction.Handler() {
                @Override
                public Transaction.Result doTransaction(final MutableData currentData) {
                    if (currentData.getValue() == null) {
                        currentData.setValue(1);
                    } else {
                        currentData.setValue((Long) currentData.getValue() + 1);
                    }
                    return Transaction.success(currentData);
                }

                public void onComplete(FirebaseError firebaseError, boolean committed, DataSnapshot currentData) {
                    if (firebaseError != null) {
                        System.out.println("Firebase counter increment failed.");
                    } else {
                        System.out.println("Firebase counter increment succeeded.");
                    }
                }
            });
_

変数msg_idは、Pushからランダムに生成されたIDです。

12
nothingness

これは、単一のカウンターをインクリメントするメソッドの例です。重要なアイデアは、エントリを作成する(1に設定する)か、既存のエントリをmutatingすることです。ここでトランザクションを使用すると、複数のクライアントが同時にカウンターをインクリメントしようとした場合、すべてのリクエストが最終的に成功することが保証されます。 Firebaseのドキュメント(強調鉱山)から:

複雑なデータを扱う場合は、トランザクション機能を使用してください同時更新によって破損する可能性があります

public void incrementCounter() {
    firebase.runTransaction(new Transaction.Handler() {
        @Override
        public Transaction.Result doTransaction(final MutableData currentData) {
            if (currentData.getValue() == null) {
                currentData.setValue(1);
            } else {
                currentData.setValue((Long) currentData.getValue() + 1);
            }

            return Transaction.success(currentData);
        }

        @Override
        public void onComplete(FirebaseError firebaseError, boolean committed, DataSnapshot currentData) {
            if (firebaseError != null) {
                Log.d("Firebase counter increment failed.");
            } else {
                Log.d("Firebase counter increment succeeded.");
            }
        }
    });
}
16
stkent

値を自動インクリメントする新しい機能がfirestoreに追加されました。単純な

document("fitness_teams/Team_1").
  updateData(["step_counter" : FieldValue.increment(500)])

参照リンク: https://firebase.googleblog.com/2019/03/increment-server-side-cloud-firestore.html

私のプロジェクトで以下のコードを使用しました。

var firestore = Firestore.instance;
firestore.collection('student').document('attendance').updateData({'total_attendace': FieldValue.increment(1)});
0
AtulK