Mena
Mena

Reputation: 3385

Firebase realtime database query using child property and wildcard

I have the following DB structure for mapping Areas to their corresponding Cities:

"Areas" : {
    "Area_1" : {
      "EnglishName" : "TheAreaNameInEnglish",
      "GermanName" : "TheAreaNameInGerman",
      "cityName" : "City_1"
    },
    "Area_2" : {
      "EnglishName" : "TheAreaNameInEnglish",
      "GermanName" : "TheAreaNameInGerman",
      "cityName" : "City_1"
    },
    "Area_3" : {
      "EnglishName" : "TheAreaNameInEnglish",
      "GermanName" : "TheAreaNameInGerman",
      "cityName" : "City_5"
    },
      --
      --
    }

Now, once a user chooses City_1, I want to display all Areas of that city. In our case, Area_1 & Area_2 only!

I am trying to do something like this:

mAreasNodeReference.(WILD_CARD).orderByChild("cityName").equalTo("City_1").addListenerForSingleValueEvent..etc

How can I achieve such query if possible? Or even how can I amend the DB stucture if that would lead to a solution?

Upvotes: 0

Views: 315

Answers (2)

Aabauser
Aabauser

Reputation: 543

Try like this

Query myTopPostsQuery = mAreasNodeReference.child("Areas").orderByChild("cityName").equalTo("City_1");
myTopPostsQuery.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if(dataSnapshot.getValue()!=null){
                    for(DataSnapshot snapshot:dataSnapshot.getChildren()){
                         String AreaName=snapshot.getKey();
                         Log.d(TAG,"AreaName "+AreaName)
                         String germanName  = snapshot.child("GermanName").getValue(String.class);
                    }                    
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

Upvotes: 1

Peter Haddad
Peter Haddad

Reputation: 80914

You can try the following:

DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("Areas");
databaseReference.orderByChild("cityName").equalTo("City_1").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
       for(DataSnapshot ds : dataSnapshot.getChildren()){
         String key         = ds.getKey();
         String germanName  = ds.child("GermanName").getValue(String.class);
         String englishName = ds.child("EnglishName").getValue(String.class);
       }
    }
}
@Override
public void onCancelled(DatabaseError databaseError) {
  }
});

Here your dataSnapshot is at node Areas, then you loop inside the direct children and it will retrieve the data according to the query.

Upvotes: 2

Related Questions