Android Firebase query return Null

Viewed 14

I'm working on a project where there's an activity which contains 3 spinners( Nested). I need the 2nd spinner to have the data based on the selected item of the 1st spinner and the data is retrieved from Firebase

enter image description here

The 1st spinner is going to have all "Gouv" values , the 2nd one is going to have the "Deleg" values where "Gouv" value is equal to the selected item "Gouv" of the 1st spinner .

Here is the code that i tried and i keep get in the log Null .

public class RechCode extends AppCompatActivity {
    DatabaseReference spinnerRef;
    Query spinnerRefG;
    Spinner spinnerG;
    Spinner spinnerD;
    Spinner spinnerL;
    ArrayAdapter<String> adapterG;
    ArrayAdapter<String> adapterL;
    ArrayAdapter<String> adapterD;
    ArrayList<String> spinnerDList;
    ArrayList<String> spinnerGList;
    ArrayList<String> spinnerLOList;
    Query spinnerRefD;
    private String ChoixG;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_rech_code);
        spinnerG = findViewById(R.id.SpinnerGouv);
        spinnerD = findViewById(R.id.SpinnerDeleg);
        spinnerL = findViewById(R.id.SpinnerLoc);
        spinnerRef = FirebaseDatabase.getInstance().getReference().child("CodePostale");
        

        //Query queryD = spinnerG.("state", "CA");
        spinnerGList = new ArrayList<>();
        spinnerDList = new ArrayList<>();
        spinnerLOList = new ArrayList<>();
        adapterD= new ArrayAdapter<String>( RechCode.this, android.R. layout. simple_spinner_dropdown_item,spinnerDList);
        adapterL= new ArrayAdapter<String>( RechCode.this, android.R. layout. simple_spinner_dropdown_item,spinnerLOList);
        adapterG= new ArrayAdapter<String>( RechCode.this, android.R. layout. simple_spinner_dropdown_item,spinnerGList);
        spinnerG.setAdapter(adapterG);
        spinnerD.setAdapter(adapterD);
        spinnerL.setAdapter(adapterL);
        ShowdataGouv();
        spinnerRefG= FirebaseDatabase.getInstance().getReference("CodePostale").child("Deleg").orderByChild("Gouv").equalTo(ChoixG);

        ShowdataDeleg();
        spinnerG.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {


            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                ChoixG = spinnerGList.get(i);
                Toast.makeText(getApplicationContext(), "Gouvernorat:" + ChoixG, Toast.LENGTH_LONG).show();
            }
            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {}
        });



        Button retour = (Button) findViewById(R.id.return_btn);

        retour.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                RetourMenu();
            }
        });




    }


    private void ShowdataLoc(String text) {
        spinnerRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot1) {
                for (DataSnapshot item:snapshot1.getChildren()){
                    spinnerLOList.add(item.child("Loc").getValue().toString());

                }
                adapterD.notifyDataSetChanged();

            }

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

            }
        });
    }

    private void ShowdataDeleg() {
        spinnerRefG.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot2) {
                for (DataSnapshot item:snapshot2.getChildren()){
                    spinnerDList.add(item.child("Deleg").getValue().toString());


                }
                Log.d("Value","BBBBBBBB"+ snapshot2);
                adapterD.notifyDataSetChanged();


            }

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

            }
        });
    }

    private void ShowdataGouv() {
        spinnerRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot3) {
                for (DataSnapshot item:snapshot3.getChildren()){
                    spinnerGList.add(item.child("Gouv").getValue().toString());
                    Log.d("Value","AAAAAAAAA"+ snapshot3);

                }
                adapterG.notifyDataSetChanged();

            }

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

            }
        });
    }


    private void RetourMenu() {
        Intent intent = new Intent(getApplicationContext(), Menus.class);
        startActivity(intent);
    }
    

}

enter image description here

1 Answers

The problem is in the way you construct the query here:

spinnerRefG= FirebaseDatabase.getInstance()
    .getReference("CodePostale")
    .child("Deleg")
    .orderByChild("Gouv")
    .equalTo(ChoixG);

You're asking to load child nodes of /CodePostale/Deleg that have a Gouv property with a value of ChoixG. But if we check the screenshot of the data, there is no /CodePostale/Deleg, so no data is returned.

What you want instead is to check the child nodes of /CodePostale and return the ones where their Deleg/Gouv property has a value of ChoixG, which you can do with:

spinnerRefG= FirebaseDatabase.getInstance()
    .getReference("CodePostale")
    .orderByChild("Deleg/Gouv")
    .equalTo(ChoixG);
Related