#java #android #firebase #firebase-realtime-database
#java #Android #firebase #firebase-realtime-database
Вопрос:
Как я могу реализовать if-else, чтобы проверить, равно ли значение поля money или больше (предварительно определенное значение в коде), проверяя поле money в базе данных реального времени? Только после этой проверки выполняется код? Я выполнил поиск в Интернете, но все методы, которые я искал, но ни один из них не был успешным в реализации.
ref.child("users").child(user.getUid()).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot ds : dataSnapshot.getChildren()) {
DatabaseReference ref = FirebaseDatabase.getInstance().getReference()
.child("users").child(user.getUid()).child("money");
ref.runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(MutableData mutableData) {
Object currentMoney = mutableData.getValue();
int totalMoney = 0;
if (currentMoney == null) {
totalMoney = moneyToRemove;
} else {
totalMoney = Integer.parseInt(String.valueOf(currentMoney)) - moneyToRemove;
}
mutableData.setValue(totalMoney);
return Transaction.success(mutableData);
}
@Override
public void onComplete(DatabaseError databaseError, boolean b,
DataSnapshot dataSnapshot) {
// Transaction completed
}
});
Структура БД
Комментарии:
1. Пожалуйста, отредактируйте свой вопрос, добавьте структуру вашей базы данных в виде файла JSON или, по крайней мере, скриншота.
2. @AlexMamo привет, спасибо за ваш ответ. Я добавляю изображение структуры БД. Спасибо
Ответ №1:
Чтобы получить всех пользователей, у которых значение money
свойства больше или равно 7
, например, вам обязательно следует использовать запрос, который выглядит следующим образом:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference usersRef = rootRef.child("users");
Query moneyQuery = usersRef.orderByChild("money").startAt(7);
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
ds.child("money").getRef().setValue(ServerValue.increment(money));
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d("TAG", databaseError.getMessage()); //Don't ignore potential errors!
}
};
moneyQuery.addListenerForSingleValueEvent(valueEventListener);
Однако, если вы хотите выполнить эту операцию только для вошедшего в систему пользователя, пожалуйста, используйте следующие строки кода:
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = rootRef.child("users").child(uid);
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(ds.child("money").getValue(Long.class) >= 7)) {
dataSnapshot.child("money").getRef().setValue(ServerValue.increment(money));
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d("TAG", databaseError.getMessage()); //Don't ignore potential errors!
}
};
uidRef.addListenerForSingleValueEvent(valueEventListener);
В котором money
переменной может быть любое положительное число для операции увеличения или отрицательное число для операции уменьшения. Кроме того, нет необходимости запускать транзакцию для простой операции увеличения / уменьшения. Мы можем просто использовать более простую недавно добавленную ServerValue.increment(value)
опцию. Транзакции используются только тогда, когда нам нужно сначала прочитать значение свойства.
Оба решения будут работать, только если вы измените тип своего money
свойства в базе данных со String на number. Поэтому, пожалуйста, внесите следующее изменение:
money: "7" //See the quotations marks?
Для:
money: 7 //No quotations marks
Комментарии:
1. привет, извините за беспокойство. я получаю эти проблемы. Не удается разрешить метод ‘setValue(java.lang. Объект)’ ‘инкремент (длинный)’ не является общедоступным в ‘com.google. firebase.database. Значение сервера ‘. Невозможно получить доступ из внешнего образа пакета imgur.com/oP8nn3d
2. Да, извините, я виноват. Я забыл добавить
.getRef()
вызов, как в первом решении. Пожалуйста, посмотрите мой обновленный ответ и скажите мне, работает ли он.3. единственная проблема в ‘increment (long)’ не является общедоступной в ‘com.google. firebase.database. Значение сервера ‘. Невозможно получить доступ из внешнего пакета
4. так ли это, на основании этого, смогу ли я проверить, равно ли оно или больше? public void onDataChange (DataSnapshot DataSnapshot) { if (DataSnapshot.child («деньги»). Получить значение (Long.class )> = 7) { DataSnapshot.child («деньги»). GetRef (). setValue ((деньги));