Как выполнить запрос с несколькими детьми? - PullRequest
1 голос
/ 25 июня 2019

Я пытаюсь выполнить действие, которое показывает классы и перечисляет их в обзоре переработчика. Тем не менее, у меня возникла проблема с запросом моих данных из Firebase. Я объясню больше после того, как я покажу свою структуру базы данных. Вот моя структура базы данных:

"Classes": {
    "-Li9nBUgnFmCWqUmwV5W": {
        "class_info": {
            "date_clasname": "August 6, 2019",
            "room_number": "131",
            "subject": "Science",
            "teacher": "Ms.Henry",
            "id": "-Li9nBUgnFmCWqUmwV5W"
        }
    },
    "-Li9n_IYwbTNPdNAsTAu": {
        "class_info": {
            "date_clasname": "August 6, 2019",
            "room_number": "131",
            "subject": "Math",
            "teacher": "Ms.Henry",
            "id": "-Li9n_IYwbTNPdNAsTAu"
        }
    },
    "-Li9naUipsa865NBpZjW": {
        "class_info": {
            "date_clasname": "August 6, 2019",
            "room_number": "131",
            "subject": "Other",
            "teacher": "Ms.Henry",
            "id": "-Li9naUipsa865NBpZjW"
        }
    },
    "-Li9nbpwp2qchwmZRDP9": {
        "class_info": {
            "date_clasname": "August 6, 2019",
            "room_number": "131",
            "subject": "Technology",
            "teacher": "Ms.Henry",
            "id": "-Li9nbpwp2qchwmZRDP9"
        }
    },
    "-Li9ne0NDyjcB4SIWi1z": {
        "class_info": {
            "date_clasname": "August 6, 2019",
            "room_number": "131",
            "subject": "Social Studies",
            "teacher": "Ms.Henry",
            "id": "-Li9ne0NDyjcB4SIWi1z"
        }
    }
},

Я пытаюсь запросить классы по предмету и показать только те, чей предмет - «Наука». Я пробовал разные вещи, но до сих пор не могу понять, как это сделать. Вот код моей деятельности:

public class Science_classes extends AppCompatActivity {
    private FirebaseDatabase database;
    private  DatabaseReference myRef, newmf;
   private List<Listdata> list;
   private RecyclerView recyclerview;
  String class_value = null;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_science_classes);
    recyclerview = (RecyclerView) findViewById(R.id.rview);
    database = FirebaseDatabase.getInstance();
    myRef = database.getReference("Classes");
    myRef.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {


            String id = dataSnapshot.getKey();

            Query query = myRef.child(id).child("class_info").orderByChild("subject").equalTo("Science");
            query.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    list = new ArrayList<>();
                    for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {

                        Class_model new_class = dataSnapshot1.getValue(Class_model.class);
                        String nameofclass = new_class.getDate_clasname();
                        String teacherofclass = new_class.getTeacher();
                        String roomnumberofclass = new_class.getRoom_number();
                        String class_key = new_class.getUid();
                        Listdata listdata = new Listdata(nameofclass, teacherofclass, roomnumberofclass, class_key);
                        //String name = userdetails.getName();
                        //String email = userdetails.getEmail();
                        //String address = userdetails.getAddress();
                        listdata.setDate_class(nameofclass);
                        listdata.setTeacher(teacherofclass);
                        listdata.setRnumber(roomnumberofclass);
                        list.add(listdata);
                    }
                    RecyclerviewAdapter2 recycler = new RecyclerviewAdapter2(list);
                    RecyclerView.LayoutManager layoutmanager = new LinearLayoutManager(Science_classes.this);
                    recyclerview.setLayoutManager(layoutmanager);
                    recyclerview.setItemAnimator(new DefaultItemAnimator());
                    recyclerview.setAdapter(recycler);
                }
                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {

                }
            });
        }



        @Override
        public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

        }

        @Override
        public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

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

        }
    });
}


    }

Я думаю, что моя проблема может заключаться в том, что я не могу получить случайно сгенерированный идентификатор и установить его как мой ребенок перед моим другим дочерним "class_info" в моем onChildAdded. Спасибо!

1 Ответ

2 голосов
/ 25 июня 2019

Вы строите запрос так:

Query query = myRef.child(id).child("class_info").orderByChild("subject").equalTo("Science");

Это говорит о том, чтобы найти потомка по id (который, я думаю, не отображается в вашем JSON), а затем найти потомок class_info, а затем найти свойство subject каждого потомка и отфильтровать его. Таким образом, путь равен $id/class_info/*/subject, где * - это дочерние узлы, которые вы хотите отфильтровать и вернуть.

Но на самом деле у вас есть /Classes/*/class_info/subject. Таким образом, у вас есть узел Classes, из которого вы хотите вернуть дочерние узлы, для которых class_info/subject имеет заданное значение. В коде это:

DatabaseReference classesRef = FirebaseDatabase.getInstance().getReference("Classes");

Query query = classesRef.orderByChild("class_info/subject").equalTo("Science");

query.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        list = new ArrayList<>();
        for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {
            Class_model new_class = dataSnapshot1.getValue(Class_model.class);
            ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...