Как прочитать все данные из Firebase в виде списка - PullRequest
1 голос
/ 18 апреля 2019

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

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

Firebase Structure

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);
    }
}

Ответы [ 2 ]

1 голос
/ 18 апреля 2019

Как и ответ Фрэнка, вы также можете иметь идентификатор песни 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 и менять адаптер на пользовательский, но сейчас, я думаю, он должен работать нормально.

1 голос
/ 18 апреля 2019

Чтобы получить ключ для 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);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...