Я пытаюсь прочитать все мои сохраненные данные из базы FireBase в виде списка. Во-первых, я не могу понять, как ссылаться на автоматически сгенерированный ключ, который создается с помощью push(); Это означает, что я не могу использовать метод получения и установки, поскольку он всегда уникален. Я также мог бы помочь с тем, как перебрать все песни. Любая помощь приветствуется.
мой класс getter и setter получает необходимые поля, но не может получить ключ.
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);
}
}
Чтобы получить ключ 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);
}
Как и ответ Фрэнка, вы также можете иметь идентификатор песни 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 и менять адаптер на пользовательский, но сейчас, я думаю, он должен работать нормально.