Добавление уже представленного значения в arraylist в arraylist - PullRequest
0 голосов
/ 11 февраля 2019

Я использую Firestore от Firebase.Там я использую ArrayList.Я сохраняю много чисел в нескольких списках ArrayLists.Но теперь у меня есть проблема, что я не могу сохранить число дважды в ArrayList.
Затем я нашел это, где это описано (документы): https://firebase.google.com/docs/firestore/manage-data/add-data
"arrayUnion () добавляет элементы в массив, нотолько элементы, которых еще нет "

Неужели нет способа сохранить число дважды или более раз в ArrayList в Firestore?

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

РЕДАКТИРОВАТЬ:
Я добавляю цифры, как это в ArrayList:

gradesRef.onSnapshot((doc) => {
          gradesRef.update({
            [grade_type]: firebase.firestore.FieldValue.arrayUnion(grade)
          });
        });

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

В JSON и в большинстве языков программирования массив может содержать одно и то же значение несколько раз.

Но многие разработчики используют массивы для реализации математических наборов, которые представляют собой набор уникальных значений.Это означает, что в большинстве языков программирования вы выполняете эту операцию во многих местах.Например, в JavaScript:

if (!array.contains("my new value")) {
  array.push("my new value");
}

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

По этой причине Cloud Firestoreдобавлена ​​атомарная операция array-union, которая добавляет элемент в массив, если его там еще нет.Эту операцию следует использовать, если вы хотите, чтобы в вашем массиве были уникальные значения.

Если вы не хотите, чтобы значения в вашем массиве были уникальными, вы должны использовать обычные операторы массива вашего языка программирования.В JavaScript это будет просто операция push(), которую мы использовали выше, но без if вокруг нее:

array.push("my new value");

Обновление на основе вашего примера кода.

gradesRef.get().then((doc) => {
    let grades = doc.data()[grade_type] || [];
    grades.push(grade);
    gradesRef.update({
        [grade_type]: grades
    });
});

Итак:

  1. Получить существующий массив оценок из документа
  2. Добавить новый элемент в конец массива
  3. Записьобновленные оценки возвращаются в базу данных.
0 голосов
/ 11 февраля 2019

Почему вы хотите добавить одни и те же данные дважды?

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

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