使用Firebase的实时数据库-检索特定信息

时间:2018-11-19 11:19:08

标签: java android firebase firebase-realtime-database

因此,我正在尝试创建实时多人游戏测验。我正在将Google Real-time Multiplayer API与Firebase实时数据库一起使用。

在游戏开始时,系统会提示用户问自己一个问题并提供两个答案,其中1个答案正确。然后,将这些信息发送到Firebase实时数据库中的子“游戏”-“ mRoomId” ---“ userId”

变量uniqueRoomID是玩家从Google API检索的房间的特定ID。

DatabaseReference myRef = database.getReference("Games").child(mRoomId).child(userId);

然后我使用setValue函数将4个值发送到该特定引用。

Upload upload = new Upload(question,answer1,answer2, userId);

 myRef.setValue(upload);

我的数据库树如下

My Realtime Database Structure

我的问题是:

当我稍后在游戏中向其他用户提出问题时,我不想显示自己的问题,只有其他用户的问题相关。

这是我的valueEventListener:

 myReference = FirebaseDatabase.getInstance().getReference().child("Games").child(mRoomId);
  myReference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
      showData(dataSnapshot);
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {

    }
  });

这是方法showData();

private void showData (DataSnapshot dataSnapshot){

for(DataSnapshot ds : dataSnapshot.getChildren()){

  Upload upload = ds.getValue(Upload.class);
  Log.d("TAG", "question1 is  " + upload.getQuestion1() );

}

}

showData中的日志从数据库返回两个不同的问题,因为它遍历子级。

我如何只获得与玩游戏的用户相关的一个问题?

我应该采用不同的结构,还是有办法只获取与我相关的值?

1 个答案:

答案 0 :(得分:0)

无法从查询中排除特定的子节点。这意味着(据我所知)您有两个基本选项:

  1. 读取两个子节点,并基于其DataSnapshot.getKey()User.getUid()具有相同值的事实来删除自己的节点客户端。
  2. 仅读取其他播放器的子节点。这要求您以某种方式已经知道其他播放器的密钥/ UID,但是将允许您使用DatabaseReference theirRef = database.getReference("Games").child(mRoomId).child(otherPlayerUid);
  3. 仅加载该播放器的数据。

另请参阅: