Как прочитать все данные из Firebase в виде списка

1

Я пытаюсь прочитать все мои сохраненные данные из базы FireBase в виде списка. Во-первых, я не могу понять, как ссылаться на автоматически сгенерированный ключ, который создается с помощью push(); Это означает, что я не могу использовать метод получения и установки, поскольку он всегда уникален. Я также мог бы помочь с тем, как перебрать все песни. Любая помощь приветствуется.

мой класс getter и setter получает необходимые поля, но не может получить ключ.

Изображение 174551

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_added_songs);

        firebaseAuth = FirebaseAuth.getInstance();


        listView = (ListView)findViewById(R.id.songsListView);
        databaseReference = FirebaseDatabase.getInstance().getReference();
        databaseReference.child("Songs").child("Added Songs").push().getKey();

        authStateListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                FirebaseUser user = firebaseAuth.getCurrentUser();
                if (user != null) {
                    // User is signed in
                    Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
                } else {
                    // User is signed out
                    Log.d(TAG, "onAuthStateChanged:signed_out");
                }

            }
        };

        databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                showData(dataSnapshot);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

    }

   private void showData(DataSnapshot dataSnapshot){
    for (DataSnapshot ds : dataSnapshot.getChildren()){
        System.out.println(ds.getKey());
        Songs songs = new Songs();
        songs.setSongId(ds.getKey()); // --> Set the song ID that is requested
        songs.setArtist_name(ds.getValue(Songs.class).getArtist_name());
        songs.setGenre(ds.getValue(Songs.class).getGenre());
        songs.setLocation(ds.getValue(Songs.class).getLocation());
        songs.setSong_link(ds.getValue(Songs.class).getSong_link());
        songs.setSong_name(ds.getValue(Songs.class).getSong_name());

        ArrayList<String> array = new ArrayList<>();
        array.add(songs.getArtist_name());
        array.add(songs.getGenre());
        array.add(songs.getLocation());
        array.add(songs.getSong_link());
        array.add(songs.getSong_name());
        array.add(songs.getSongId()); // --> Set the ID to the song
        ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_dropdown_item_1line);
        listView.setAdapter(adapter);
    }
}
Теги:
firebase
firebase-realtime-database

2 ответа

1

Чтобы получить ключ DataSnapshot вызовите getKey() для этого снимка. Так:

private void showData(DataSnapshot dataSnapshot){
    for (DataSnapshot ds : dataSnapshot.getChildren()){
        System.out.println(ds.getKey());

Обратите внимание, что эта строка не делает ничего полезного:

databaseReference.child("Songs").child("Added Songs").push().getKey();

Вы, наверное, ищете это:

    databaseReference = FirebaseDatabase.getInstance().getReference();
    databaseReference = databaseReference.child("Songs").child("Added Songs");

    ...

    databaseReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

            showData(dataSnapshot);
        }
0

Как и ответ Фрэнка, вы также можете иметь идентификатор песни String в вашем POJO, и когда вы получаете каждый ключ с помощью getKey() вы можете сохранить этот ключ в массиве, поэтому, когда вы раздуваете представления каждой строки, вы можете щелкнуть их и у них будет уникальный ключ, назначенный каждой песне в списке.

Пример (из ответа Франка вы получите ключ)

private void showData(DataSnapshot dataSnapshot){
    for (DataSnapshot ds : dataSnapshot.getChildren()){
        System.out.println(ds.getKey());
        Songs songs = new Songs();
        songs.setSongId(ds.getKey()); // --> Set the song ID that is requested
        ArrayList<String> array = new ArrayList<>();
        array.add(songs.getSongId()); // --> Set the ID to the song

При этом вы можете назначить каждой песне в списке их уникальный идентификатор, поэтому, когда вы нажимаете их в своем списке, вы можете получить доступ к их конкретному идентификатору, чтобы получить нужные вам данные

редактировать

Я думаю, что в списке ничего не отображается, потому что, когда вы инициализируете свой ArrayAdapter вы не передаете извлеченные ему данные, взгляните на этот конструктор

ArrayAdapter(Context context, int resource, List<T> objects)

И взгляни на свою

ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_dropdown_item_1line);

Вам не хватает данных для адаптера, замените это на это

ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_dropdown_item_1line,array);

Поскольку он находится внутри цикла for, вы увидите, что элементы заполняются по очереди, если вы хотите просто сложить все элементы одновременно, переместите эти две строки за пределы цикла for.

for (DataSnapshot ds : dataSnapshot.getChildren()){
//...
}
ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_dropdown_item_1line,array);
listView.setAdapter(adapter);

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

Поэтому переместите объявление ArrayList за пределы цикла for

ArrayList<String> array = new ArrayList<>();
for (DataSnapshot ds : dataSnapshot.getChildren()){
    //...
    }
    ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_dropdown_item_1line,array);
    listView.setAdapter(adapter);

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

  • 0
    я обновил код, добавив его, но он, кажется, печатает «Artists», «Public users» и «Songs» в качестве ключа в logcat
  • 0
    Это потому, что вам нужно пойти на один уровень глубже с вашей ссылкой, посмотрите на ответ Фрэнка
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню