0

I want to get all the missions for a specific user (constraint num 1), but only the available users (constraint num 2).

I know I can overcome one constraint by 'order by' and 'equalTo' functions, but i'm failing at overcoming the second one.

This is my firebase db:

db

This is my current result at the app (A finished mission is there! I don't want it!):

app

This is my relevant code:

    public class PendingFragmentUser extends Fragment {

    private String TAG = "dDEBUG";
    private RecyclerView mPendingList;

    private DatabaseReference mMissionsDb;
    private FirebaseAuth mAuth;

    private String mCurrent_user_id;

    private View mMainView;

    Query queries;

    public PendingFragmentUser() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {


        mMainView = inflater.inflate(R.layout.fragment_pending_user, container, false);

        mPendingList = (RecyclerView)mMainView.findViewById(R.id.pending_recycler_user);
        mAuth = FirebaseAuth.getInstance();

        mCurrent_user_id = mAuth.getCurrentUser().getUid();

        mMissionsDb = FirebaseDatabase.getInstance().getReference().child("Missions");
        queries = mMissionsDb.orderByChild("user_uid").equalTo(mCurrent_user_id);
        mMissionsDb.keepSynced(true);

        mPendingList.setHasFixedSize(true);
        mPendingList.setLayoutManager(new LinearLayoutManager(getContext()));

        // Inflate the layout for this fragment
        return mMainView;
    }

    @Override
    public void onStart() {
        super.onStart();

        final FirebaseRecyclerAdapter<Mission, PendingFragmentUser.MissionsViewHolder> firebaseMissionsUserRecyclerAdapter = new FirebaseRecyclerAdapter<Mission, PendingFragmentUser.MissionsViewHolder>(
                Mission.class,
                R.layout.missions_single_layout,
                PendingFragmentUser.MissionsViewHolder.class,
                queries
        ) {
            @Override
            protected void populateViewHolder(PendingFragmentUser.MissionsViewHolder missionViewHolder, final Mission missionModel, final int missionPosition) {
//                Log.d(TAG, "inside populateViewHolder" + missionModel.getType() + " , " + missionModel.getDescription());
                missionViewHolder.setMissionName(missionModel.getType());
                missionViewHolder.setMissionDescription(missionModel.getDescription());
                missionViewHolder.setMissionStatus(missionModel.getStatus());

            }
        };

        mPendingList.setAdapter(firebaseMissionsUserRecyclerAdapter);
    }

    public static class MissionsViewHolder extends RecyclerView.ViewHolder {
        View mView;
        Button button ;

        public MissionsViewHolder(View itemView) {
            super(itemView);
            mView = itemView;
            button = (Button)mView.findViewById(R.id.pending_single_button);

        }

        public void setMissionName(String name){
            TextView mMissionNameView = mView.findViewById(R.id.mission_single_name);
            mMissionNameView.setText(name);
        }

        public void setMissionStatus(String status){
            TextView mMissionStatusView = mView.findViewById(R.id.mission_single_status);
            mMissionStatusView.setText(status);
            if (status.equals("Available")){
                mMissionStatusView.setTextColor(Color.parseColor("#008000"));;
            } else {
                mMissionStatusView.setTextColor(Color.parseColor("#FF0000"));;
            }
        }

        public void setMissionDescription(String description){
            TextView mMissionDescriptionView = mView.findViewById(R.id.mission_single_description);
            mMissionDescriptionView.setText(description);

        }
    }
}

How can I overcome this firebase limitations?

To filter all missions for specific user:

    queries = mMissionsDb.orderByChild("user_uid").equalTo(mCurrent_user_id);

And now I would like to do:

    queries = mMissionsDb.orderByChild("user_uid").equalTo(mCurrent_user_id).orderByChild("status").equalTo("Available");

But it's not possible in firebase.

In addition, I have to use real-time adapter because it's critical the my UI shows exactly the DB with minimum delay in changes at the DB. Thanks

jonb
  • 845
  • 1
  • 13
  • 36
  • 2
    Possible duplicate of [Query based on multiple where clauses in Firebase](https://stackoverflow.com/questions/26700924/query-based-on-multiple-where-clauses-in-firebase) – Peter Haddad Feb 14 '18 at 21:39
  • I've seen this post, but it's refering to the Javascript version. My answers could have android solutions that the javascript won't have @PeterHaddad For example - can I somehow 'get rid' in the client from all of the missions that are 'Finished' ? How can I do it? I've tried 'if' condition inside the populate function, but it's still presented blanc places, because it's based on the 'queries' reference (The db) – jonb Feb 14 '18 at 22:00
  • 1
    What you should do (using `FirebaseRecyclerAdapter` and the Realtime Database) is create a child for "available missions" and "finished missions" because the `FirebaseRecyclerAdapter` always displays the complete representation of your query. – creativecreatorormaybenot Feb 14 '18 at 22:11
  • Best solution I currently think about - is spliting the Missions DB by their statuses, and in that way get rid of the extra constraint :( EDIT: @creativecreatorormaybenot I just saw your comment, it just what i've intended.. Thanks - Too bad firebase doesn't allow SQL behaviour! – jonb Feb 14 '18 at 22:38
  • Why not u get all the missions over specific users and later filter out at status = available (at application side). firebase doesn't allow double nested queries. another thing u can do switch to cloud firestore :) – Mohsin Feb 16 '18 at 14:34
  • Because the Firebase recycler adapters shows what in the DB reference or the query, therefore filtering on the client is not possible with it. What I did - spliting the missions into 2 children - Available and Pending... And i'll check Cloud Firestore i'm not familiar with it :) – jonb Feb 16 '18 at 14:38

0 Answers0