Как добавить значение в существующий массив в Firestore, у которого уже есть это точное значение, не перезаписывая его? - PullRequest
0 голосов
/ 05 февраля 2020

В моем приложении для викторины игрок вводит свой первый ответ как Integer, который создает array в Firestore следующим образом:

Map<String, Object> answer = new HashMap<>();
answer.put("answers", Arrays.asList(answerPlayer1Int));

answerRef.document("Round 1").collection(uidPlayer1).document(uidPlayer1)
       .set(answer).addOnCompleteListener(new OnCompleteListener<Void>() {
               @Override
               public void onComplete(@NonNull Task<Void> task) {

              }
        });

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

Я знаю, в чем причина этого, но теперь я хочу знать, возможно ли даже просто добавить какое-либо значение в существующий массив в Firestore?

Вот код второго ответа:

answerRef.document("Round 1").collection(uidPlayer1).document(uidPlayer1)
        .update("answers", FieldValue.arrayUnion(answer2Player1Int)).addOnCompleteListener(new OnCompleteListener<Void>() {
              @Override
              public void onComplete(@NonNull Task<Void> task) {

              }
           });

Это вывод, который я сейчас получаю, когда игрок использует один и тот же ответ на каждый вопрос:

enter image description here

И вот как я хочу, чтобы вывод был:

enter image description here

Любая помощь снова очень ценится!

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

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

Вы также можете решить эту проблему с помощью arrayUnion оператор, но на этот раз он гарантирует, что каждое уникальное значение существует только один раз в вашем массиве. При использовании arrayUnion.

вы не можете добавить дублирующее значение. Также имейте в виду, что в соответствии с официальной документацией относительно членства в массиве :

Если в массиве есть несколько экземпляров запрашиваемого значения, документ включается в результаты только один раз.

0 голосов
/ 05 февраля 2020

Попробуйте код ниже, с SetOptions.merge () Я думаю, что это будет работать,

Map<String, Object> answer = new HashMap<>();
            answer.put("answers", Arrays.asList(answerPlayer1Int));
            answerRef.document("Round 1").collection(uidPlayer1).document(uidPlayer1)
                    .set(answer,SetOptions.merge()).addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {

                }
            });

Надеюсь, это поможет !!

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