Android - база данных Firebase

Мое приложение было мобильным приложением для генерации токенов. Я использую Firebase для хранения своих данных. Токен был сгенерирован с помощью подсчета дочерних элементов в базе данных firebase. Проблема, с которой я столкнулся, заключалась в том, что если два пользователя записываются на прием одновременно, то оба пользователя получают один и тот же номер токена. Например, количество детей в firebase было 5. Если пользователи A и B записываются на прием, то оба пользователя получают номер токена 6. Но другой пользователь C, записывающийся на прием (после A и B), получает правильный номер токена. 8.

Мой код:

int ct=1;

public void onDataChange(DataSnapshot dataSnapshot) {
    for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {
        ++ct;
        Log.d("log", "onDataChange: " + dataSnapshot1.child("Appointment").child("artistName").getValue());
    }
}

Переменная ct представляет номер токена.

Какое решение помогло решить указанную выше проблему?

1
0
76
1

Ответы 1

Маркер не должен создаваться на основе количества дочерних элементов в узле. Это не будет служить цели однозначной идентификации токена в вашей базе данных.

Насколько я могу понять вашу проблему, вы хотите предоставить токен пользователям вашего приложения для автоматических встреч с некоторыми артистами. В этом случае я хотел бы предложить вам взять другую таблицу в базе данных firebase, в которой будут храниться все токены. Отметьте номер токена вместе с исполнителем.

Итак, структура финальной таблицы будет примерно такой.

Appointment
    -- Artists
           -- TokenNumber

Token 
    --TokenNumber

Если вы знакомы с реляционной базой данных, вы можете подумать о своем номере токена как о внешнем ключе другой таблицы, который автоматически увеличивается каждый раз, когда токен назначается некоторой встрече.

Надеюсь, это поможет!

Обновлять

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

Как увеличить токен автоматически? @ReazMurshed

Buvana Megan 08.04.2018 07:36

На самом деле я пробовал обновленный код. Но это похоже на ошибку. Еще раз попробую обновленный код.

Buvana Megan 08.04.2018 08:01

Я думаю, что приведенный выше код увеличивает единичное значение счетчика firebase. Но мне нужна переменная счетчика для каждого зарегистрированного пациента.

Buvana Megan 08.04.2018 08:08

Считайте номер токена внешним ключом в другой таблице. На самом деле это идея.

Reaz Murshed 08.04.2018 08:16

Мне не нужно одно значение. Значение номера токена варьируется для разных пользователей.

Buvana Megan 08.04.2018 08:23

Конечно, это будет варьироваться от пользователя к пользователю. Однако должен быть один источник генерации токенов, чтобы вы могли генерировать каждый токен уникальным образом. .

Reaz Murshed 08.04.2018 08:46

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