Ошибка при чтении Firebase: от значения firebase до дочернего

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

Моя проблема в том, что: когда я нажимаю на кнопку и хочу передать значение «код цены», записанное в базе данных, в «цена». Но обязательно, чтобы pricecode был предварительно записан в базу данных.

Ошибка при чтении Firebase: от значения firebase до дочернего

String price = String.valueOf(db.child("User").child("pricecode"));

и вместо значения "1000" пишет там ссылку на ключ. Подробнее читайте на скриншоте.

public void onClickB1 (просмотр)

    {
        DatabaseReference db = FirebaseDatabase.getInstance().getReference();
        String id = mDataBase.getKey();
        String name = String.valueOf(textB1.getText());

        String price = String.valueOf(db.child("User").child("pricecode")); // PROBLEM

        User newUser = new User(id,name,price);
        //mDataBase.push().setValue(newUser);

        if (!TextUtils.isEmpty(name))
        {
            mDataBase.push().setValue(newUser);
        }
        else
        {
            Toast.makeText(this,"empty text",Toast.LENGTH_LONG).show();
        }
    }
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
25
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

String price = String.valueOf(db.child("User").child("pricecode")); and instead of the value "1000", it writes a reference to the key there.

Это ожидаемое поведение после следующей операции:

String price = String.valueOf(db.child("User").child("pricecode"))

Сохраняет ли нет в переменной price фактическое значение (1000) поля pricecode. Код внутри метода valueOf() является ссылкой, поэтому, когда вы передаете эту ссылку методу valueOf(), вы получаете:

https://testkornze...

Таким образом, существует способ нет, с помощью которого вы можете прочитать значение определенного поля, существующего в базе данных реального времени без, прикрепив прослушиватель. Ранее я ответил на ваш вопрос о том, как читать значение pricecode. Таким образом, чтобы иметь возможность использовать значение pricecode, все операции, которым требуются данные из базы данных, должны быть добавлены внутри метода onComplete().

«все операции, требующие данных из базы данных, должны быть добавлены в метод onComplete()». Я не совсем понимаю, как это выглядит? Можно краткий набросок, пожалуйста

ILGAMOV 13.05.2022 14:14

Как правильно сочетать onComplete с onCLick?

ILGAMOV 13.05.2022 14:23

Выполняйте щелчок только тогда, когда данные доступны. Попробуйте также взглянуть на этот отвечать.

Alex Mamo 13.05.2022 14:58

Извините, но я не понимаю, как связать onClick и onComplete. Я уже слишком запутался.

ILGAMOV 13.05.2022 15:20

Это шаги. Прикрепите прослушиватель кликов, внутри onClick добавьте существующий код здесь, а внутри onComplete используйте значение pricecode tp для создания нового объекта, верно?

Alex Mamo 13.05.2022 15:26

Алексей, спасибо за помощь! Я постараюсь добиться желаемого результата.

ILGAMOV 13.05.2022 16:17

Как объяснил Алекс, этот код просто создает ссылку на путь в базе данных, но фактически не считывает значение из этого пути:

db.child("User").child("pricecode")

Чтобы прочитать значение, вам нужно либо вызвать addListenerForSingleValueEvent, либо вызвать get по ссылке, как показано в документации Firebase на чтение данных один раз. Исходя из этого:

db.child("User").child("pricecode").get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DataSnapshot> task) {
        if (!task.isSuccessful()) {
            Log.e("firebase", "Error getting data", task.getException());
        }
        else {
            DataSnapshot snapshot = task.getResult()l

            String price = String.valueOf(snapshot.getValue());

            User newUser = new User(id,name,price);
            //mDataBase.push().setValue(newUser);

            if (!TextUtils.isEmpty(name))
            {
                mDataBase.push().setValue(newUser);
            }
            else
            {
                Toast.makeText(this,"empty text",Toast.LENGTH_LONG).show();
            }
        }
    }
});

Благодарю вас! Сейчас попробовал ваш метод, получил "ноль".

ILGAMOV 13.05.2022 16:17

Что там означает "получил ноль"? --- Кроме того: вы уже прошли код onComplete в отладчике построчно, проверяя значение каждой переменной в каждой строке? Если да, то какая первая строка не сделала того, что вы от нее ожидаете?

Frank van Puffelen 13.05.2022 16:37

Строковая цена = String.valueOf(snapshot.getValue()); Да, есть запись в firebase и выводит нулевое значение Пример: public void onClickB1 (View view) {вот твой код}

ILGAMOV 13.05.2022 16:41

Я ожидаю, что значение pricecode при нажатии на кнопку (OnClick) передаст свое значение цене (user-price)

ILGAMOV 13.05.2022 16:43

Null возвращает в пользовательской цене с этим кодом (ваш фрагмент выше)

ILGAMOV 13.05.2022 16:46

Что выводит snapshot.getValue() (то есть без String.valueOf)?

Frank van Puffelen 13.05.2022 17:02

Если String price = snapshot.getValue(); Ошибка: несовместимые типы. Найдено: 'java.lang.Object', требуется: 'java.lang.String' Если String price = String.valueOf(snapshot.getValue()); Вывод: пользователь - цена = null Хотя код цены = 1000 или любое другое значение

ILGAMOV 13.05.2022 17:10

Да, я не это имел в виду. Я имею в виду, если вы просто Log.d(snapshot.getValue()), что вы получите на выходе.

Frank van Puffelen 13.05.2022 17:32

Ошибка: несовместимые типы. Найдено: 'java.lang.Object', требуется: 'java.lang.String' Я вас не понимаю, извините

ILGAMOV 13.05.2022 21:00

Если вы Log.d(snapshot.getValue()), что он выводит?

Frank van Puffelen 14.05.2022 02:17

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