Как я могу получить значение в базе данных Firebase с Android? - PullRequest
1 голос
/ 23 сентября 2019

Моя база данных Firebase Realtime выглядит следующим образом:

{Singer :
    Billie Eilish :
        01 :
            songType : "type01"
            songName : "bad guy"
        02 :
            songType : "type02"
            songName : "bury a friend"
    Lauv :
        01 :
            songType : "type01"
            songName : "I Like Me Better"
        02 :
            songType : "type03"
            songName : "lonely"
    Anne Marie :
        01 :
            songType : "type02"
            songName : "2002"
        ...
        ...
        ...
}

Если я хочу получить все песни типа "type01", что мне делать?Это мой класс Adapter, который показывает данные в recyclerView в MainActivity.

Класс адаптера:

public class MyAdapter extends Recycler.Adapter {
    ...
    @Override
    public void onBindViewHolder(@Nonnull ViewHolder holder, int i) {
        ...
        Query query = FirebaseDatabase.getInstance().getReference().child("Singer");
        options = new FirebaseRecyclerOptions.Builder<ItemModel>().setQuery(query, new SnapshotParser<ItemModel>() {
            @NonNull
            @Override
            public ItemModel parseSnapshot(@NonNull DataSnapshot snapshot) {
                if (snapshot.child("songType").getValue().toString().equals("type01") {
                    String song = snapshot.child("songName").getValue().toString();
                    return new ItemModel(song);
                }
                return null;
            }
        }).build();
        recyclerAdapter = new AnotherAdapter(options);
        recyclerAdapter.startListening();
}

Я думаю, что это странно в запросе.Называется только ребенок "Певица".Я хочу позвонить всем детям и получить, что songType является «type01».AnotherAdapter просто расширяет FirebaseReyclcerAdapter и просто устанавливает текст в своем AnotherViewHolder.

Ответы [ 2 ]

3 голосов
/ 23 сентября 2019

почему бы вам просто не пойти с данными выборки, которые содержат только songType: type01 попробуйте это

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

Query query = reference.child("Singer").orderByChild("songType").equalTo("type01");
query.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        if (dataSnapshot.exists()) {
            for (DataSnapshot issue : dataSnapshot.getChildren()) {
                //set featched value to recyclerview 
            }
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});
2 голосов
/ 23 сентября 2019

Поскольку вы передаете ссылку на Singers в представление переработчика, ваш parseSnapshot вызывается для каждого певца.Там вы должны убедиться, что вы проверяете songType каждого song дочернего элемента певца, где теперь вы проверяете songType самих певцов (который никогда не существует, поэтому никогда не входит вблок if).

Так что это будет примерно так:

Query query = FirebaseDatabase.getInstance().getReference().child("Singer");
options = new FirebaseRecyclerOptions.Builder<ItemModel>().setQuery(query, new SnapshotParser<ItemModel>() {
    @NonNull
    @Override
    public ItemModel parseSnapshot(@NonNull DataSnapshot snapshot) {
        String song = "No song found";
        for (DataSnapshot songSnapshot: snapshot.getChildren()) {
            String songType = songSnapshot.child("songType").getValue(String.class)
            if (songType.equals("type01") {
              song = songType;
              ...

Хотя я не уверен, что это то, что вы хотите, потому что вы, кажется, хотитесписок песен, пока вы переходите в список певцов.Вышеуказанное будет работать, только если у каждого певца есть только одна песня type01 (не 0, не больше).

Если это не так, адаптеры в FirebaseUI не будут соответствовать вашим потребностям с вашей текущейструктура данных, так как они показывают список элементов из базы данных, в то время как вы хотите отображать элементы из древовидной структуры.

Два основных варианта, которые приходят на ум в этом случае:

  1. Создайте свой собственный адаптер, как правило, на основе ArrayAdapter, как показано здесь .
  2. Измените структуру данных так, чтобы все песни были в плоском списке(и тогда певец становится собственностью каждой песни).
...