使用子属性和通配符的Firebase实时数据库查询

时间:2019-04-30 10:20:55

标签: android firebase firebase-realtime-database

我具有以下数据库结构,用于将区域映射到其对应的城市:

"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"
    },
      --
      --
    }

现在,一旦用户选择City_1,我想显示该城市的所有区域。在我们的情况下,仅Area_1和Area_2!

我正在尝试做这样的事情:

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

如果可能的话,如何实现这种查询?甚至如果可以解决问题,我该如何修改数据库结构?

2 个答案:

答案 0 :(得分:1)

您可以尝试以下操作:

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) {
  }
});

这里dataSnapshot在节点Areas处,然后在直接子级中循环,它将根据查询检索数据。

答案 1 :(得分:1)

尝试这样

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) {

            }
        });