Kotlin MVVM Firestore
Всем привет, изучаю котлин для себя,возникла проблема
у меня есть коллекция в 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()
}
}
Как мне загрузить и список клиентов и машин при подгрузке данных пользователя?
Ответы (2 шт):
Автор решения: pie
→ Ссылка
Но, думаю, надо делать отдельные функции. Потому-что, если, что-то не загрузится можно снова сделать запрос.
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'
Автор решения: vusalteam
→ Ссылка
Чутка похардкодил и смог получить список клиентов у пользователя, но все еще не понимаю как получать 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()
}
}


