Kotlin MVVM Firestore

Рейтинг: 0Ответов: 2Опубликовано: 14.01.2023

Всем привет, изучаю котлин для себя,возникла проблема

у меня есть коллекция в firestore users в котором есть список пользователей и у каждого пользователя есть своя коллекция clients в которой тоже есть своя коллекция cars

Вот мои модели

data class User(
val id: String = "",
val name: String = "",
val email: String = "",
val password: String = "",
val company: String = "",
val clients: ArrayList<Client>? = null)


data class Client(
val id: String = "",
val fio: String = "",
val phone: String = "",
val car: ArrayList<Car>? = null)


data class Car(
val brand: String = "",
val model: String = "",
val number: String = "")

Вот я загружаю данные пользователя

override fun getUserData(userId: String): Flow<Response<User>> = callbackFlow {
    Response.Loading
    val snapShotListener = firestore.collection("users").document(userId)
        .addSnapshotListener { snapshot, error ->
            val response = if (snapshot != null) {
                val userData = snapshot.toObject(User::class.java)
                Response.Success<User>(userData!!)
            } else
                Response.Error(error?.message ?: error.toString())

            trySend(response).isSuccess
        }
    awaitClose {
        snapShotListener.remove()
    }
}

Как мне загрузить и список клиентов и машин при подгрузке данных пользователя?

введите сюда описание изображения

введите сюда описание изображения

введите сюда описание изображения

Ответы

▲ 0

Но, думаю, надо делать отдельные функции. Потому-что, если, что-то не загрузится можно снова сделать запрос.

fun getData(user: User): Flow<Response<User>> = flow {
   emit(Response.Loading())

   try {
      val clients = firestore
         .collection(...)
         ...
         .get()
         .await()
         .toObject(...)

      val cars = firestore
         .collection(...)
         ...
         .get()
         .await()
         .toObject(...)

      emit(
         Response.Success(
            user.copy(clients = clients.copy(cars = cars))
         )
      )
   } catch (e: Exception) {
      emit(Response.Error(e.localizedMessage ?: "")
   }
}
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.6.4'
▲ 0

Чутка похардкодил и смог получить список клиентов у пользователя, но все еще не понимаю как получать cars

override fun getUserData(userId: String): Flow<Response<User>> = callbackFlow {
    Response.Loading
    val userClients = arrayListOf<Client>()
    val clientsListener = firestore
        .collection("users").document(userId).collection("clients")
        .addSnapshotListener { clients, e ->
            if (clients != null) {
                for (client in clients) {
                    val data = client.toObject(Client::class.java)
                    userClients.add(data)
                }
            } else
                Response.Error(e?.message ?: e.toString())
        }
    val snapShotListener = firestore.collection("users").document(userId)
        .addSnapshotListener { snapshot, error ->
            val response = if (snapshot != null) {
                val userData = snapshot.toObject(User::class.java)

                Response.Success<User>(userData?.copy(clients = userClients)!!)
            } else
                Response.Error(error?.message ?: error.toString())
            trySend(response).isSuccess
        }
    awaitClose {
        clientsListener.remove()
        snapShotListener.remove()
    }
}