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

Информация о базе данных на рисунке - это версия данных в лобби, и всякий раз, когда второй действительный пользователь присоединяется к игре, я хочу, чтобы эта база данных была удалена (потому что она рисуется как интерфейс, и я не хочу, чтобы другие пользователи должны присоединиться к полной игре), и я хочу, чтобы она была включена в новую базу данных «активных игр».
Я знаю, как это сделать, но мне интересно, как я могу переместить 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();
}