簡體   English   中英

在 Firebase 中自動增加一個值

[英]Auto-increment a value in 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 是從推送中隨機生成的 id。

這是一個遞增單個計數器的示例方法。 關鍵思想是您要么創建條目(將其設置為等於 1)要么改變現有條目。 在此處使用事務可確保如果多個客戶端同時嘗試增加計數器,則所有請求最終都會成功。 從 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.");
            }
        }
    });
}

向 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)});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM