-1

Hello Everyone I am using firebase database in my app. I am able to add data to database. Now I want to implement search in my app, I have two option for search users,

1)Blood Group
2)User Area

I am able to get data as per blood group selection, but I don't know how can I fetch data with blood group and area. (Multiple Selection Filter)

Now if the user will select 'A+' as blood group from spinner and select Area 'ABC' Then result would come as Users with 'A+' blood group and 'ABC' area.

search_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


                System.out.println("Default Selected"+sel_blood_group);



                mFirebaseDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        //Your Logic here
                        for (DataSnapshot eventSnapshot : dataSnapshot.getChildren()) {
                            UserRegisterModel mModel = eventSnapshot.getValue(UserRegisterModel.class);
                           // Log.e("DATA" ,""+ mModel.getName());
                        }


                        Query chatRoomsQuery = mFirebaseDatabase.orderByChild("blood_group").equalTo(sel_blood_group);

                        chatRoomsQuery.addListenerForSingleValueEvent(new ValueEventListener() {
                            @Override
                            public void onDataChange(DataSnapshot dataSnapshot) {
                                if (dataSnapshot.exists()) {
                                    // dataSnapshot is the "issue" node with all children with id 0
                                    for (DataSnapshot issue : dataSnapshot.getChildren()) {
                                        // do something with the individual "issues"
                                        UserRegisterModel mModel = issue.getValue(UserRegisterModel.class);
                                        Log.e("QUERY DATA" ,""+ mModel.getName());
                                    }
                                }
                            }

                            @Override
                            public void onCancelled(DatabaseError databaseError) {

                            }
                        });
                        Log.e("DATA" ,""+ chatRoomsQuery.toString());
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });
            }
        });
Aditya Vyas-Lakhan
  • 13,409
  • 16
  • 61
  • 96

2 Answers2

2

Firebase RealTime Database does not support multiple where clauses. So try to query with one filter and then filter the next one programatically.

search_button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {


            System.out.println("Default Selected"+sel_blood_group);
            System.out.println("Default Selected"+sel_area);


            mFirebaseDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    //Your Logic here
                    for (DataSnapshot eventSnapshot : dataSnapshot.getChildren()) {
                        UserRegisterModel mModel = eventSnapshot.getValue(UserRegisterModel.class);
                       // Log.e("DATA" ,""+ mModel.getName());
                    }


                    Query chatRoomsQuery = mFirebaseDatabase.orderByChild("blood_group").equalTo(sel_blood_group);

                    chatRoomsQuery.addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            if (dataSnapshot.exists()) {
                                // dataSnapshot is the "issue" node with all children with id 0
                                for (DataSnapshot issue : dataSnapshot.getChildren()) {
                                    // do something with the individual "issues"
                                    UserRegisterModel mModel = issue.getValue(UserRegisterModel.class);
                                   if(mModel.getArea().equals(sel_area))
                                    Log.e("QUERY DATA" ,""+ mModel.getName());
                                }
                            }
                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {

                        }
                    });
                    Log.e("DATA" ,""+ chatRoomsQuery.toString());
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });
        }
    });enter code here
Praveen Kumar
  • 138
  • 1
  • 10
0

You can make userName to be added only once using the following method. I have assumed that you are storing the user details in UserRegisterModel class. Please take care of the DatabaseReferences as I have used what you have mentioned and I am not aware of your Database structure.

Query chatRoomsQuery = mFirebaseDatabase.orderByChild("User_Name").equalTo(userRegisterModel.getUserName());

                chatRoomsQuery.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        if (dataSnapshot.exists()) {
                                Log.e("UserAlready Registered");
                            }
                            else
                            {
                            mFirebaseDatabase.push().setValue(userRegisterModel);;
            Log.i("User added Successfully");
                            }
                        }
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });

I have not tested the code but I think it will work! :)

Praveen Kumar
  • 138
  • 1
  • 10