Проблема в том, что для сохранения структуры, которую вы имеете в виду, вам придется обновить весь документ в хранилище.
Таким образом, идеальный поток вашего приложения должен быть для выполнения get()
, чтобы получить полный документ, который уже существует в виде карты, добавьте свой новый счет на карту и затем обновите его. Вы можете сделать это, изменив свою функцию saveUserScoreToFirebase
на следующую:
РЕДАКТИРОВАТЬ: Согласно нашему разговору в чате, вы хотите добавить дополнительное поле в эту коллекцию, которое называется gameTime, и у вас есть функция, которая получает объект модели игры, который содержит как gameResults, так и gameTime, и превращает его в json, что упрощает нашу жизнь, потому что все, что вам нужно сделать, это добавить этот json на карту перед ее обновлением. Обратите внимание, что все пункты, о которых я говорил ранее, по-прежнему действительны, поэтому код будет выглядеть так:
private void saveUserScoreToFirebase(User user, Game game, boolean isScoreExist, final ScoreUserCallback callback) {
Log.d(TAG, "Saving user to database.");
Map<String, Object> gameMap = new HashMap<>();
if(isScoreExist){
db.collection("scores").document(user.getUsername())
.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
// Document found in the offline cache
DocumentSnapshot document = task.getResult();
gameMap = document.getData();
// if you are starting with # 0 you can take the '+1' from this
gameMap.put(String.valueOf(gameMap.size()+1), game.toJSON());
db.collection("scores").document(user.getUsername())
.update(gameMap).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
isSaveScoreSuccess = task.isSuccessful();
callback.onCallback(isSaveScoreSuccess);
}
});
} else {
Log.d(TAG, "Getting previous score failed with following exception: ", task.getException());
}
}
});
}else{
gameMap.put(String.valueOf(gameMap.size()+1), game.toJSON());
db.collection("scores").document(user.getUsername())
.set(gameMap).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
isSaveScoreSuccess = task.isSuccessful();
callback.onCallback(isSaveScoreSuccess);
}
});
}
}
ПРИМЕЧАНИЕ : это не проверено, но должно быть хорошей отправной точкой для вас. рассмотрите описанный ранее logi c, если он не работает сразу.