【问题标题】:filter child data in firebase过滤firebase中的子数据
【发布时间】:2019-11-14 11:04:57
【问题描述】:

我想填充 recyclerview,以便我可以使用它来显示帖子。

这就是我填充回收站视图的方式: How can I retrieve data from Firebase to my adapter

但根据用户所在的国家/地区,我需要过滤仅与他的国家/地区相关的帖子。

在数据库结构中,TO、FROM、PASSING、REQUEST FROM 是我需要过滤的。 因为在这些参数中我输入了国家代码,所以我可以只过滤用户所在的国家/地区。

我可以在查询中添加这个,我是否能够从孩子那里检索其他信息,所以当用户点击 recyclerview 中的帖子时,我可以在帖子中显示它。

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();             Query query = rootRef.child("Trading info").orderbyChild("TO location").equals(USA);

所以如果孩子包含美国,它将显示在帖子中,当用户点击帖子时,我是否能够像往常一样检索所有数据。

抱歉,如果没有最好的解释。 我想知道,我是否能够从过滤的子节点中检索所有其他子节点。 从子节点中检索包含 USA 的子节点。


并且可以使用多个查询,因为我需要检查 FROM、PASSING、TO 和 REQUEST FROM 位置子节点,如果它包含我需要的国家代码。

【问题讨论】:

  • 那么您的问题是该查询是否有效?
  • 是的,stackoverflow.com/questions/32526960/… 这是我想要完成的,但我是否能够检索父子数据。因为我需要在 subchild 中检查 .equal。
  • 恐怕我没听懂你在说什么。请提供一个具体的例子。
  • 我想根据子值过滤子数据。当我过滤它时,我如何检索孩子的其他值,如“可用性”、“电子邮件”、“姓名”(见上图,我的数据库结构)。我正在使用 postId 的 FROM、PASSING 和 TO 位置子子项来过滤数据,以显示与他目前所在国家/地区相关的用户帖子。因此,如果他在 MNE 中,它将显示他的帖子。所以我需要一种方法来检索其他数据以进行发布,例如“电子邮件”、“地图”等。但是当我告诉 Query 查找路径时,它不能返回,所以它只会读取 .equal ,但不能检索我的其他数据。
  • @IgorLerinc 你试过答案了吗?

标签: java android firebase firebase-realtime-database


【解决方案1】:

要检索 emailnameavailability,请尝试以下操作:

DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("Trading info");
databaseReference.orderbyChild("TO location").equals("USA").addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
         for(DataSnapshot ds : dataSnapshot.getChildren()){
           String fromLocation    = ds.child("FROM location").getValue(String.class);
           String passingLocation = ds.child("PASSING location").getValue(String.class);

              DatabaseReference voluneterService = FirebaseDatabase.getInstance().getReference("Volunteer services");
              voluneterService.orderbyChild("FROM location").equals(fromLocation).addValueEventListener(new ValueEventListener() {
                   @Override
               public void onDataChange(DataSnapshot dataSnapshot) {
                    for(DataSnapshot ds : dataSnapshot.getChildren()){
                        String fromLocation    = ds.child("availability").getValue(String.class);
                        String passingLocation = ds.child("email").getValue(String.class);
                        }
                     }
                    @Override
              public void onCancelled(DatabaseError databaseError) {
                     throw databaseError.toException();
                   }
                });
          }
    }
    @Override
    public void onCancelled(DatabaseError databaseError) {
        throw databaseError.toException();
    }
});

首先在节点Trading info 添加引用,然后在属性TO location 上使用orderByChild 并检索FROM locationPASSING location

然后添加对节点Volunteer services 的另一个引用,并在属性FROM location 上使用orderByChild。在equalTo() 中使用您在第一个侦听器中检索的变量fromLocation,然后您将能够检索emailnameavailibility

【讨论】:

  • 感谢您的帮助,它帮助我了解了如何完成它。但是您的答案的问题是:我的应用程序需要监听 3 个子子项(在交易信息中)。我的意思是,如果“TO location”不包含“USA”,则检查“FROM location”节点是否包含“USA”,如果“FROM location”不包含“USA”,则检查“PASSING location”是否包含“USA”价值。在“志愿者服务”中也是如此,检查“FROM location”是否包含“USA”,如果没有,则检查“REQUEST FROM”是否包含“USA”。这正是我想要完成的,比如 if,else 语句。
  • 因为在您的代码中,它是这样的:如果“TO location”包含“USA”,则读取其他两个子子项(如果它们包含相同)。但我需要我在评论中解释的行为。添加多个 DatabaseReference 方法来检查是否完成?
  • 是的,我忘了提,如果这 3 个子孩子中的任何一个包含“美国”(在“交易信息”中)或在“志愿者服务”中,如果这 2 个子孩子包含“美国” ";然后检索“可用性”、“旅行日期”、“描述”、“电子邮件”、“地图”、“旅行方式”、“姓名”、“电话”、“计划到达地点的时间”、“发布日期” “, “标题”。这完全是我想要实现的。
  • 只是在第一个监听器中检索所有值然后添加一个查询并检查它是否不为空并附加一个监听器
  • 还有一个问题:firebase 会知道从其他孩子的子孩子中找到“美国”的地方检索数据吗?我的意思是,如果他在 "postId" child 中发现 "postId" 的子子项包含 "USA"("TO location" 包含 "USA"),它将检索其他子项(如 "title"、"name"等)来自同一个“postId”孩子。因为我在 MySQL 上工作,你需要在那里手动完成所有操作
猜你喜欢
  • 2017-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-17
  • 2019-08-12
相关资源
最近更新 更多