在树的Firebase查询与深度和多个孩子

时间:2017-10-30 13:31:24

标签: android firebase firebase-realtime-database

我在使用值查询firebase数据库并获取特定节点时遇到问题。我的架构如下所示:

Firebase schema

在我的模式中,'workLocations'属于'excavationWorks','excavationWorks'属于'挖掘列表'。

这意味着特定workLocation的路径为excavationLists/excavationWorks/workLocations/(specific workLocation)

我遇到的问题是我想通过位置值(比如伦敦)查询workLocations节点并获取父节点(红色圆圈键,它是特定workLocation的键)。

我搜索并阅读了很多帖子,但我还没有设法让它发挥作用。

我的代码如下所示:

 DatabaseReference reference = FirebaseDatabase.getInstance().getReference();

 Query query = reference.child("workLocations").orderByChild("location").equalTo("London");
 query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot workLoc : dataSnapshot.getChildren()) {
                    // do something with the individual "issues"
                    Log.d(TAG, workLoc.getKey());
                }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

谢谢

1 个答案:

答案 0 :(得分:1)

要实现这一点,您需要像这样查询数据库两次:

DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
DatabaseReference workLocationsRef = reference
    .child("excavationLists")
    .child("excavationWorks")
    .child("workLocations");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot dSnapshot : dataSnapshot.getChildren()) {
            for(DataSnapshot ds : dSnapshot.getChildren()) {
                String key = ds.getKey();

                Query query = workLocationsRef.child(key).orderByChild("location").equalTo("London");
                ValueEventListener eventListener = new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot snapshot) {
                        String description = snapshot.child("description").getValue(String.class);
                        Log.d("description", description);
                        String partentKey = snapshot.getRef().getParent().getKey();
                        Log.d("partentKey", partentKey);
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {}
                };
                query.addListenerForSingleValueEvent(eventListener);
            }               
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
workLocationsRef.addListenerForSingleValueEvent(valueEventListener);