База данных Android Firebase продолжает обновлять значение

Я пытаюсь получить оценку авторов из базы данных Firebase в реальном времени. Я успешно получаю значение счета. Затем я добавляю 100 к этому значению и вставляю новое значение, однако, когда я вставляю значение оценки, оно продолжает увеличиваться на 100, например, если оценка была равна 500 вместо изменения на 600, она изменится на 600, затем на 700, затем на 800 и т. д. Если я покажу тост в методе addExtraScore, он отобразится один раз и так, как предполагалось.

Деятельность

private void getAuthorScore()
    {
        database = FirebaseDatabase.getInstance().getReference();
        database.child("Users").child(authorID).addValueEventListener(new ValueEventListener()
        {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot)
            {
                User author = dataSnapshot.getValue(User.class);

                authorScore = author.getScore();

                addExtraScore();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError)
            {

            }
        });
    }

    private void addExtraScore()
    {
        int score = authorScore + 100;

        FirebaseUtil.updateUsersScore(authorID, score);
    }

Утилита Firebase частная статическая база данных DatabaseReference db;

public static void updateUsersScore(String id, int score)
{
    db = FirebaseDatabase.getInstance().getReference();
    db.child("Users").child(id).child("score").setValue(score);
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
470
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы решить эту проблему, измените следующую строку кода:

database.child("Users").child(authorID).addValueEventListener(/* ... */);

к

database.child("Users").child(authorID).addListenerForSingleValueEvent(/* ... */);

Чтобы получить данные только один раз. Использование addValueEventListener() означает, что вы получаете данные в режиме реального времени и для каждого изменения onDataChange() вызывается снова.

Ха-ха, я разработчик iOS, и у меня была такая же проблема, и этот ответ помог мне найти решение. Большое спасибо! :)

Abdullah Ajmal 14.09.2019 17:58

Другие вопросы по теме