Мое приложение было мобильным приложением для генерации токенов. Я использую 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 представляет номер токена.
Какое решение помогло решить указанную выше проблему?
Маркер не должен создаваться на основе количества дочерних элементов в узле. Это не будет служить цели однозначной идентификации токена в вашей базе данных.
Насколько я могу понять вашу проблему, вы хотите предоставить токен пользователям вашего приложения для автоматических встреч с некоторыми артистами. В этом случае я хотел бы предложить вам взять другую таблицу в базе данных 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.");
}
}
});
}
На самом деле я пробовал обновленный код. Но это похоже на ошибку. Еще раз попробую обновленный код.
Я думаю, что приведенный выше код увеличивает единичное значение счетчика firebase. Но мне нужна переменная счетчика для каждого зарегистрированного пациента.
Считайте номер токена внешним ключом в другой таблице. На самом деле это идея.
Мне не нужно одно значение. Значение номера токена варьируется для разных пользователей.
Конечно, это будет варьироваться от пользователя к пользователю. Однако должен быть один источник генерации токенов, чтобы вы могли генерировать каждый токен уникальным образом. .
Как увеличить токен автоматически? @ReazMurshed