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

Итак, в моем приложении есть игровое лобби, в котором пользователь создает игру, а затем другой пользователь присоединяется к игре. Когда пользователь создает игру, он сохраняется в базе данных как user1 в соответствующем узле, а когда пользователь присоединяется к игре, он сохраняется как user2 в том же узле. Здесь они хранят свою информацию, как показано ниже.

enter image description here

Информация о базе данных на рисунке - это версия данных в лобби, и всякий раз, когда второй действительный пользователь присоединяется к игре, я хочу, чтобы эта база данных была удалена (потому что она рисуется как интерфейс, и я не хочу, чтобы другие пользователи должны присоединиться к полной игре), и я хочу, чтобы она была включена в новую базу данных «активных игр».

Я знаю, как это сделать, но мне интересно, как я могу переместить user1 и user2 как объекты User в новую базу данных. Я пытался создать обратный вызов для этих элементов как объектов пользователя, но у меня было много проблем с этим, поэтому я надеюсь, что есть другой способ сделать это.

Прямо сейчас, когда в узле существует поле user2, этот метод для создания игры называется:

private void createGame(String gameID) {
    FCGames.child(gameID).removeValue();
    FCGameMaker fc = new FCGameMaker(null, null, false, false, gameID);
    FlipCoinGames.child(gameID).setValue(fc);
    startActivity(new Intent(FlipCoinLobby.this, FlipCoin.class));
}

У меня установлено null для пользовательских объектов, потому что я не знаю, как получить пользовательские объекты из старой базы данных в эту новую. Это мой конструктор FCGameMaker, так что вы можете понять это немного лучше.

public FCGameMaker(User player1, User player2, boolean gameStarted, boolean gameFinished, String gameId) {
    this.player1 = player1;
    this.player2 = player2;
    this.gameStarted = gameStarted;
    this.gameFinished = gameFinished;
}

Вот как создается мое поле user1 всякий раз, когда кто-то делает игру

public void createLobbyGame () {
    final User user1 = new User(userName, 0, null, FirebaseAuth.getInstance().getUid(), gameID);
    AlertDialog.Builder fcDialog = new AlertDialog.Builder(this);

    fcDialog.setPositiveButton("Accept", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface fcDialog, int which) {
            double wager = Double.parseDouble(wagerText.getText().toString());
            //creating the game
            FCLobbyMaker gameMaker = new FCLobbyMaker(user1, null, wager, gameID,
                    false, false);

            FCGames.child(gameID).setValue(gameMaker);
        }
    });

}

В последнем методе есть кое-что еще. Я просто удалил ненужный код, потому что в этом методе немало всего.

Может кто-нибудь помочь?

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

private void createGame(final String gameID) {
    FCGames.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            DataSnapshot ds1 = dataSnapshot.child(gameID).child("user1");
            DataSnapshot ds2 = dataSnapshot.child(gameID).child("user2");
            String userName = ds1.child("userName").getValue().toString();
            String HorT = ds1.child("horT").getValue().toString();
            String uid = ds1.child("uid").getValue().toString();
            String userName2 = ds2.child("userName").getValue().toString();
            String HorT2 = ds2.child("horT").getValue().toString();
            String uid2 = ds2.child("uid").getValue().toString();

            User user1 = new User(userName, 0, HorT, uid, gameID);
            User user2 = new User(userName2, 0, HorT2, uid2, gameID);

            FCGameMaker fc = new FCGameMaker(user1, user2, false, false, gameID);
            FlipCoinGames.child(gameID).setValue(fc);
            startActivity(new Intent(FlipCoinLobby.this, FlipCoin.class));
        }

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

        }
    });

    FCGames.child(gameID).removeValue();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...