【问题标题】:Firebase realtime database query using child property and wildcard使用子属性和通配符的 Firebase 实时数据库查询
【发布时间】:2020-01-22 02:01:11
【问题描述】:

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

"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

如果可能的话,我怎样才能实现这样的查询?或者如果这会导致解决方案,我该如何修改数据库结构?

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案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,然后您在直接子代中循环,它将根据查询检索数据。

    【讨论】:

      【解决方案2】:

      这样试试

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-07
        • 2018-09-14
        • 2021-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-31
        • 1970-01-01
        相关资源
        最近更新 更多