Автоматическое увеличение значения в Firebase

Как автоматически увеличить значение, хранящееся в Firebase, от клиента Android?

В настоящее время: объявляю int id = 1. Когда я увеличиваю, я вижу, что значения 2, 3 и т.д. Сохраняются. Это хорошо, но когда я повторно запускаю проект, id снова устанавливается на 1.

Я хочу, чтобы он вел себя как статическая переменная, поэтому я могу создать идентификатор, который будет переходить от 1 до бесконечности без перезагрузки.

ОБНОВЛЕНО ОТКАЗАНО

Я использовал следующее, чтобы передать ссылку 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);                                 
  }

Теперь я пытаюсь использовать переданную ссылку и строку в public void incrementCounter(Firebase publref,String my_msg) в методе oncomplete, но это дает мне ошибку.

   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.

Ответ 1

Здесь примерный метод, который увеличивает один счетчик. Основная идея заключается в том, что вы либо создаете запись (устанавливаете ее равной 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.");
            }
        }
    });
}