Как автоматически генерировать идентификаторы в Котлине с помощью Firebase?

Как добавить гостям автоматически сгенерированные идентификаторы? Например, как показано на рисунке ниже, у меня есть два гостя: первый с ID=0, а второй с ID=1. Я хочу удалить пронумерованные идентификаторы и вместо этого добавить сгенерированные идентификаторы.

Моя функция:

fun saveToFirebase(
 guest: MutableMap<String, Any>,
 eventId: String,
 navController: NavController,
 local: Context) {

  val db = FirebaseFirestore.getInstance()
  val dbCollectionEvents = db.collection(COLLECTION_EVENTS)

  if (guest.toString().isNotEmpty()) {
    // Update the document with the new data
    dbCollectionEvents.document(eventId)
        .update(GUESTS, FieldValue.arrayUnion(guest))
        .addOnSuccessListener {
            // Document updated successfully
            Toast.makeText(
                local,
                "Guest added",
                Toast.LENGTH_SHORT
            ).show()
        }
        .addOnFailureListener { e ->
            // Handle failures
            Log.w("ERROR", "saveToFirebase: Error add guest", e)
            Toast.makeText(
                local,
                "Guest addition not functioning",
                Toast.LENGTH_SHORT
            ).show()
        }
   }
}

1
0
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Когда вы используете FieldValue.arrayUnion(guest), это означает, что вы пытаетесь добавить новый элемент внутри массива. Эти числа 0 и 1 на самом деле являются индексами, точнее, первым и вторым индексом массива.

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

db
|
--- events (collection)
     |
     --- eventId (document)
          |
          --- guests (map)
               |
               --- 8ac6c1d0-55e2-4130-b247-3b1b005bcd39 //👈
                    |
                    --- adults: 2
                    |
                    --- date_registered: 29 March 2024 at 22:50:09 at UTC+2
                    |
                    --- //The other fields

Чтобы добиться этого, вам нужно использовать функцию update(), но не сообщая Firestore добавить ее в гостя array. Видите ли, ключ первого объекта — это идентификатор, который вы ищете.

Привет, Зартилас. Мой ответ помог? Могу ли я помочь вам с другой информацией?

Alex Mamo 01.04.2024 08:22
Ответ принят как подходящий

Получив ответ Алекса Мамо, я изменил свой код следующим образом:

.update("гости.$guestId", гость)

if (guest.toString().isNotEmpty()) {
        // Get the guest_id from Guest model
        val guestId = guest.toMap()["guest_id"]
        // Update the document with the new data
        dbCollectionEvents.document(eventId)
            .update("guests.$guestId", guest)
            .addOnSuccessListener {}
}

Другие вопросы по теме

Как программно связать проект и базу данных Firebase пользователя с приложением Flutter?
Используйте функции Firebase для облачных функций Firebase v2
Аутентификация Firebase не работает на 127.0.0.1, но работает на локальном хосте
Создание PDF-файла в Firestore с помощью Pdfplum: путь к шаблону «нет такого объекта»
Как получить данные из базы данных реального времени Firebase в виде списка
Удалите старые строки в журнале изменений для расширения Firestore в BigQuery
Есть ли способ ограничить попытки входа в систему для аутентификации по электронной почте и паролю Firebase?
Ошибка: исключение Dart из преобразованного Future. Используйте свойства error для получения коробочной ошибки и stack для восстановления трассировки стека
Платформа Firebase Identity Platform – настройка политики паролей в среде, отличной от JS (Python или UI)?
Как обеспечить использование косой черты на хосте Firebase только для каталогов