(если, иначе) контрольный номер вопроса, равный или больший в базе данных реального времени

#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 ((деньги));