如何从具有相同ID的特定子节点检索数据

时间:2017-10-31 13:15:29

标签: java android firebase firebase-realtime-database

这是我的firebase数据库的外观: enter image description here

正如你在上面所看到的,我有3个Id在玩家。 game_id在所有三个孩子中都是相同的。我想知道的是检索mDisplayName game_id"-KweUgQj9sV01KvgbCu"的{​​{1}}。

这是我现在的代码,但它不起作用。我做错了什么,我应该怎么做?

DatabaseReference nishi = FirebaseDatabase.getInstance().getReference("players");
        nishi.child("-KweUgQj9sV01KvgbCu").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot snapshot) {
                List<Object> commentKeys = new ArrayList<>();
                for (DataSnapshot childSnapshot: snapshot.getChildren()) {
                    commentKeys.add(childSnapshot.getValue());
                }
                Log.d("Data:", commentKeys.toString());

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

4 个答案:

答案 0 :(得分:1)

您应该创建一个包含变量name,id和points的User模型,然后编写如下所示的代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
Query query = rootRef.child("players").equalTo("-KweUgQj9sV01KvgbCu").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot snapshot) {
            for (DataSnapshot s: snapshot.getChildren()) {
            User user = s.getValue(User.class);
            Log.e("Display Name: ", user.getName());
          }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

答案 1 :(得分:1)

您需要像这样查询您的数据:

DatabaseReference nishi = FirebaseDatabase.getInstance().getReference("players");
    Query query = nishi.orderByChild("game_id").equalTo("-KweUgQj9sV01KvgbCu");
    query.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot snapshot) {
                List<Object> commentKeys = new ArrayList<>();
                for (DataSnapshot childSnapshot: snapshot.getChildren()) {
                    commentKeys.add(childSnapshot.getValue());
                }
                Log.d("Data:", commentKeys.toString());

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

答案 2 :(得分:0)

您需要使用equalTo(...)

FirebaseDatabase.getInstance().getReference("players").equalTo("-KweUgQj9sV01KvgbCu", "game_id")
      .addChildEventListener(new ChildEventListener() {
             // TODO: implement the ChildEventListener methods
             // ...
      });

答案 3 :(得分:0)

使用实际的数据库结构无法实现此目的,因此您需要使用denormalization来解决此问题。这意味着,您需要通过创建另一个名为gameIds的节点来更改数据库结构,在该节点中您需要添加每个游戏ID下所有用户的所有名称。您的数据库结构应如下所示:

Firebase-root
    |
    --- gameIds
          |
           --- -KweUgQj9sV01KvgbCu
                    |
                    --- Users
                          |
                          --- Name1: true
                          |
                          --- Name2: true
                          |
                          --- Name3: true

最后,只需在这个新创建的节点上附加一个侦听器,并从dataSnapshot对象中获取与特定游戏ID相对应的所有名称。