Чтение из базы данных Firebase - PullRequest
0 голосов
/ 05 мая 2020

Я пытаюсь читать из базы данных Firebase, я читал и искал везде, но я в тупике.

Вот все, что я сделал.

Зависимости:

реализация 'com.google.firebase: firebase-storage: 9.2.1'

реализация 'com.google.firebase: firebase-database: 9.2.1'

реализация 'com.google.firebase: firebase-auth: 9.2.1'

реализация 'com.google.firebase: firebase-core: 9.2.1'

minSdkVersion: 15

DatabaseReference mDatabase;
mDatabase = FirebaseDatabase.getInstance().getReference();

затем в методе Button onClick я помещаю слушателя:

mDatabase.child("List").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                String savedData = dataSnapshot.getValue(String.class);
                Log.d(TAG, "snapshot: " + savedData);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Log.d(TAG, "Error");
            }
    });

Вот посмотрите на базу данных.

Был бы признателен за ввод.

1 Ответ

0 голосов
/ 05 мая 2020

Вы пытаетесь прочитать значение String под List. Но прямо под List нет строкового значения, а есть список объектов под ним. Чтобы получить фактические значения, вам нужно будет перемещаться по структуре JSON в вашем коде.

Что-то вроде:

DatabaseReference mDatabase;
mDatabase = FirebaseDatabase.getInstance().getReference();
mDatabase.child("List").addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        for (DataSnapshot tierSnapshot: dataSnapshot.getChildren()) {
            Log.d(TAG, tierSnapshot.getKey(); // "Tier 1", "Tier 1 B"
            for (DataSnapshot secondSnapshot: tierSnapshot.getChildren()) {
                Log.d(TAG, secondSnapshot.getKey(); // "Tier 2", "Tier 2 B"

                String str = secondSnapshot.getValue(String.class);
                Log.d(TAG, str); // null, "2 B"

                Long num = secondSnapshot.getValue(long.class);
                Log.d(TAG, num); // 2, null

            }
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.w(TAG, "Error", databaseError);
    }
});

Также следует отметить, что ваши значения равны другой тип: первый - это число 2, а второй - строка "2 B". Отсюда два вызова getValue(), чтобы получить оттуда конкретный тип c. Вы также можете просто сделать secondSnapshot.getValue() и обработать полученный объект, как обычно (например, позвонить ему toString()).

...