Как мне автоматически увеличить значение, хранящееся в 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.

14
nothingness 7 Мар 2015 в 17:06

2 ответа

Лучший ответ

Вот пример метода, который увеличивает один счетчик. Основная идея состоит в том, что вы либо создаете запись (устанавливая ее равной 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.");
            }
        }
    });
}
17
stkent 7 Мар 2015 в 14:18

В 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)});
3
AtulK 19 Фев 2020 в 22:36