Android中基于字段和返回父项的Firebase查询

Android中基于字段和返回父项的Firebase查询,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我希望搜索我的Firebase数据库,找到与我的查询匹配的字段:值配对,然后返回该父项的键或父对象,以便我也可以获取其他信息 Firebase数据库如下所示: Events{ -KiXlIGhB6k-HpCKfO3n{ name:"Breakfast at Tiffany's", owner:"Tim", startTime:{ startHour:1, startMinute:30 }, ... }, -dFgfh8E

我希望搜索我的Firebase数据库,找到与我的查询匹配的字段:值配对,然后返回该父项的键或父对象,以便我也可以获取其他信息

Firebase数据库如下所示:

Events{
  -KiXlIGhB6k-HpCKfO3n{
    name:"Breakfast at Tiffany's",
    owner:"Tim",
    startTime:{
      startHour:1,
      startMinute:30
    },
    ...
  },
  -dFgfh8Efa-Hpwe6Goqp0{...}
}
我目前正在尝试:

public void importSchedule(String ownerName){
DatabaseReference events = 
FirebaseDatabase.getInstance().getReference("Events"); //Inside the Events list

Query allOwnersEvents = events.equalTo(ownerName); //Find events equalTo ownerName provided

allOwnersEvents.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot post : dataSnapshot.getChildren()) {
           // This is where the parent's could be queried, all events belonging to an "owner" should be cycled through
        }
    }
    public void onCancelled(DatabaseError databaseError) {}
});

但是,在for循环中放置断点时,它永远不会被触发。我想知道我是否正确地尝试了查询,或者是否有更简单的方法来完成此操作。

它从未被触发,因为您的
数据库引用是错误的。当您查询时,您缺少一个孩子。要获得正确的
数据库参考
,请使用以下代码:

    DatabaseReference events = FirebaseDatabase.getInstance().getReference("Events")
    events.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String eventKey = ds.getKey(); //parent key

            DatabaseReference allOwnersEvents = FirebaseDatabase.getInstance().getReference("Events").child(eventKey);
            allOwnersEvents.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    String ownerName = dataSnapshot.child("ownerName").getValue(String.class); //do what you want with ownerName
                }
                public void onCancelled(DatabaseError databaseError) {}
            });
        }
    }
    public void onCancelled(DatabaseError databaseError) {}
});

其中,
eventId
是由
push()
方法生成的唯一id。希望有帮助。

如果我查看所有事件(而不仅仅是eventID指定的事件),该怎么办。我正在尝试获取所有在其内部具有自己名称的事件,因此这是针对所有事件的,而不是针对单个事件的。因为
eventId
它是一个变量而不是一个值。如果我在您的代码中使用了
child(“-KiXlIGhB6k-HpCKfO3n”)
而不是仅用于单个事件。但这适用于您的所有事件。如果我误解了您,很抱歉,您是说
child(eventID)
将查询我的所有事件?并将唯一键存储在eventID变量中?或者您是说
child(“-KiXlIGhB6k-HpCKfO3n”)
将只查询一个孩子。在这种情况下,我假设我没有试图查询的事件的ID请查看我的更新答案,其中您还有
父项
。是的,因为我使用了错误的方法
String eventKey=dataSnapshot.getKey()
而不是
String eventKey=ds.getKey()。再次更新我的答案。