Android Cloud Firestore добавляет новый элемент в список документов - PullRequest
0 голосов
/ 03 января 2019

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

  db = FirebaseFirestore.getInstance();
    String userid = FirebaseAuth.getInstance().getCurrentUser().getUid();

    db.collection("Users").document(userid);

    Map<String, Object> docData = new HashMap<>();

    Map<String, Object> nestedData = new HashMap<>();
    nestedData.put("Ernährung2", true);


    docData.put("channelAbos", nestedData);
    db.collection("Users").document(FirebaseAuth.getInstance().getCurrentUser().getUid())
    .set(docData);

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Относительно метода SetOptions merge() в качестве официальной документации говорит:

Изменяет поведение вызовов set () для замены только значений, указанных в его аргументе данных.Поля, пропущенные в вызове set (), останутся нетронутыми.

Таким образом, метод SetOptions.merge() заменит только поля в fieldPaths.Любое поле, которое не указано в fieldPaths, игнорируется и остается без изменений.

В качестве заключения, если документ не существует, он будет создан.Если документ существует, его содержимое will be overwritten с вновь предоставленными данными, если только вы не укажете, что данные должны быть объединены в существующий документ.Поэтому, чтобы решить эту проблему, измените следующую строку кода:

db.collection("Users").document(FirebaseAuth.getInstance().getCurrentUser().getUid())
.set(docData);

на

db.collection("Users").document(FirebaseAuth.getInstance().getCurrentUser().getUid())
.set(docData, SetOptions.merge());
0 голосов
/ 03 января 2019

Согласно документации , set (), вызываемая с одним аргументом, перезаписывает весь документ каждый раз.

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

Если вы хотите добавить значение в существующий список, вы должны использовать FieldValue.arrayUnion (), как описано в та же страница документации :

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

Я укажу, что то, что вы сейчас делаете с Map, создаст объект, а не список.Убедитесь, что у вас есть поле типа списка / массива, а не объект для работы.

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