База данных в реальном времени с использованием Firebase - получение конкретной информации - PullRequest
0 голосов
/ 19 ноября 2018

Итак, я пытаюсь создать многопользовательскую викторину в реальном времени.Я использую Google Real-time Multiplayer API вместе с базой данных Firebase в реальном времени.

В начале игры пользователям предлагается задать себе вопрос и дать два ответа, где 1 ответ правильный,Затем эта информация отправляется в базу данных реального времени Firebase под дочерним элементом «Игры» - «mRoomId» --- «userId»

Переменная uniqueRoomID - это конкретный идентификатор комнаты, из которой они получают игроков.Google API.

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

И я отправляю 4 значения с помощью функции setValue для этой конкретной ссылки.

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

 myRef.setValue(upload);

Дерево моей базы данных выглядит следующим образом

My Realtime Database Structure

Мой вопрос:

Когда я представляю вопрос другому пользователю позже в игре, я не хочу показывать мой собственный вопрос, важен только вопрос другого пользователя.

Это мое значениеEventListener:

 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 голосов
/ 19 ноября 2018

Нет способа исключить конкретный дочерний узел из запроса. Это означает, что (насколько я вижу) у вас есть два основных варианта:

  1. Прочитайте оба дочерних узла и удалите свою собственную клиентскую сторону узла, основываясь на том факте, что ее DataSnapshot.getKey() имеет то же значение, что и User.getUid().
  2. Только для чтения дочерний узел другого игрока. Это требует, чтобы вы каким-то образом уже знали ключ / UID другого игрока, но позволили бы вам затем загружать только данные этого игрока с DatabaseReference theirRef = database.getReference("Games").child(mRoomId).child(otherPlayerUid);

Также см .:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...