Search code examples
androidfirebasefirebase-realtime-databasedata-retrieval

Android Firebase Retrieving data as a list from multiple nods


I am using firebase realtime database in my first android app. I'm trying to retrieve data from firebase as an arraylist of "username" but i'm constantly having the Query returning a null result. i'm very new to firebase so i'm really struggling with data retrieval errors.

"Marchand" : {
    "Taha" : {
      "adress" : "58 avenu St Eugène ",
      "blockage" : false,
      "latitude" : 35.7498635,
      "longitude" : -0.5566705,
      "mail" : "mailmail@gmail.com ",
      "password" : "123456",
      "signalement" : 0,
      "telephone" : "0666666666",
      "username" : "Taha"
    },
    "Yasmine" : {
      "adress" : "Address kkdndbdk ",
      "blockage" : false,
      "latitude" : 35.7498636,
      "longitude" : -0.5566704,
      "mail" : "randommail@gmail.com",
      "password" : "bobo",
      "signalement" : 0,
      "telephone" : "06999999",
      "username" : "Yasmine"
    }
.
.
.

This is one of my attempts, i tried to use the order-by-child method to iterate through the multiple nods that i have but i'm sure that it's not the right way to do this, this gives me null poiter exceptions because the datasnapshot is returning a NULL value :

 referenceMarchand = rootNode.getReference("Marchand");
final ArrayList<String> types = new ArrayList<>();
        Query users =  referenceMarchand.orderByChild("username");

        users.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                types.add(dataSnapshot.child("username").toString());

            }

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

            }
        });

Solution

  • lets make use of some functions of firebase, Lets see it works for you.

    part 1)

    we will save it another way around

    "Merchant" : {"Name" : "Taha"
    "ID" :"-KSMCMCMnnkd"},//Firebase generated id
    {"Name" : "Yasmine"
    "ID" :"-KSMCMccccnkd"},//Firebase generated Id
    ...........
    

    Part 2)

    And Save the Details

    "Details" : {
          "ID" : "-KSMCMCMnnkd" //Firebase generated id
          "adress" : "58 avenu St Eugène ",
          "blockage" : false,
          "latitude" : 35.7498635,
          "longitude" : -0.5566705,
          "mail" : "mailmail@gmail.com ",
          "password" : "123456",
          "signalement" : 0,
          "telephone" : "0666666666",
          "username" : "Taha"},
          {
          "ID":"-KSMCMccccnkd" //Firebase generated id
          "adress" : "Address kkdndbdk ",
          "blockage" : false,
          "latitude" : 35.7498636,
          "longitude" : -0.5566704,
          "mail" : "randommail@gmail.com",
          "password" : "bobo",
          "signalement" : 0,
          "telephone" : "06999999",
          "username" : "Yasmine"}
      
    

    In Part 1)

    DatabaseRefrence ref = FirebaseDatabase.getInstance("/Path");
    String id = ref.child("Merchant").push().getKey(); //Firebase generated id
    Merchant merchant = new Merchant();
    merchant.setId(id);
    merchant.setName("SomeName");
    ref.child("Merchant").child(id).setValue(merchant);
    

    Part 2)

    Detail detail = new Detail();
    detail.setAddress("Some Address");
    detail.setBlockage("false");
    detail.setLatitude("SomeValue");
    detail.setEmail("someText@gmail.com");
    ......
    ref.child("Details").child(id).setValue(detail);
    

    Now

    List<Merchant> merchants = new ArrayList<>();
    List<Detail> details = new ArrayList<>();
    ref.child("Merchant").addValueEventListener(new ValueEventListener(){
    @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
    
                   for(Datasnapshot snapshot:dataSnapshot){
                      Merchant merchant = snapshot.getValue(Merchant.class);
                      merchants.add(merchant);
    }
    
                }
    
                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {
    
                }
    });
    
    ref.child("Details").addValueEventListener(new ValueEventListener(){
        @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        
                       for(Datasnapshot snapshot:dataSnapshot){
                          Detail detail = snapshot.getValue(Detail.class);
                          details.add(detail);
        }
        
                    }
        
                    @Override
                    public void onCancelled(@NonNull DatabaseError databaseError) {
        
                    }
        });
    

    Now you can get the details for some merchant or save it in local database for later querying.