I want to display only Books from Books location in Firebase Realtime database filtering by child "discipline" obtained from Lecturers location

Viewed 22

I want to display only Books from Books location in Firebase Realtime database filtering by child "discipline" obtained from Lecturers location.

Code to display the books in Recycler Adapter

public class LecturerBooks extends AppCompatActivity {

    RecyclerView recyclerView;
    LecturerBookAdapter lecturerBookAdapter;
    FirebaseAuth mAuth;
    FirebaseAuth.AuthStateListener authListener;
    DatabaseReference dbRef;
    DatabaseReference userRef;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lecturer_books);

        recyclerView=findViewById(R.id.recyclerView);    

        mAuth=FirebaseAuth.getInstance();

        authListener = mAuth -> {
            FirebaseUser user = mAuth.getCurrentUser();
            if (user == null) {
                startActivity(new Intent(LecturerBooks.this, LecturerLogin.class));
                finish();
            }
            else {
                String mail=user.getEmail();
                userRef=FirebaseDatabase.getInstance().getReference("Lecturers");
                userRef.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot snapshot) {
                        for (DataSnapshot ds : snapshot.getChildren()) {
                            if (Objects.equals(ds.child("email").getValue(), mail)) {

                                String program = ds.child("discipline").getValue(String.class);
                                dbRef = (DatabaseReference) FirebaseDatabase.getInstance().getReference("Books");
                                dbRef.addValueEventListener(new ValueEventListener() {
                                    @Override
                                    public void onDataChange(@NonNull DataSnapshot snapshot) {
                                        if(Objects.equals(snapshot.child("discipline").getValue(), program))
                                        {    
                                                recyclerView.setLayoutManager(new LinearLayoutManager(LecturerBooks.this));

                                                FirebaseRecyclerOptions<BookModel> options = new FirebaseRecyclerOptions.Builder<BookModel>()
                                                        .setQuery(dbRef, BookModel.class)
                                                        .build();

                                                lecturerBookAdapter = new LecturerBookAdapter(options);
                                                recyclerView.setAdapter(lecturerBookAdapter);

                                                lecturerBookAdapter.startListening();
                                        }    
                                    }

                                    @Override
                                    public void onCancelled(@NonNull DatabaseError error) {    
                                    }
                                });   
                            }
                        }
                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError error) {
                    }
                });
            }
        };    
    }
    @Override
    protected void onStart() {
        super.onStart();
        mAuth.addAuthStateListener(authListener);
        //lecturerBookAdapter.startListening();
    }
    @Override
    protected void onStop() {
        super.onStop();
        if (authListener != null) {
            mAuth.removeAuthStateListener(authListener);
        }
        //lecturerBookAdapter.stopListening();
    }
    public void onBackPressed() {
        startActivity(new Intent(LecturerBooks.this,LecturerMain.class));
        finish();
    }
}

Firebase Recycler view is not displaying filtered data.

Books location

firebase Books location

Lecturer location in firebase

Lecturer location in firebase

1 Answers

If you want to only load the books for a specific discipline, you can use a query to order and filter the data:

String program = ds.child("discipline").getValue(String.class);
dbRef = (DatabaseReference) FirebaseDatabase.getInstance().getReference("Books");
Query query = dbRef.orderByChild("discipline").equalTo(program);
dbRef.addValueEventListener(new ValueEventListener() {
  ...

Don't forget to define an index on discipline in your database's rules, to ensure the query can be performed on the server.

Related