#kotlin #google-cloud-firestore #kotlin-coroutines #coroutine
# #котлин #google-облако-firestore #kotlin-сопрограммы #сопрограмма
Вопрос:
Приведенный ниже код дает мне желаемый результат, извлекая данные из firestore с помощью потока сопрограмм.
suspend fun getFeedPer() = flow<State<Any>> {
emit(State.loading())
val snapshot = dbRef.collection("FeedInfo/FeedPercent/DOC/")
.whereGreaterThanOrEqualTo("bodyWeight", 0.80)
.limit(1)
.get().await()
val post = snapshot.toObjects(FeedPer::class.java)
Log.d("TAG", "getFeedPer: ${snapshot.documents[0].id}")
Log.d("TAG", "getFeedPer: $post")
emit(State.success(post))
}.catch {
emit(State.failed(it.message.toString()))
}.flowOn(Dispatchers.IO)
Теперь я пытаюсь добавить еще один фильтр в свой запрос. Для этого я использую task.
val docRef=dbRef.collection("FeedInfo/FeedPercent/DOC/")
val task1=docRef.whereGreaterThanOrEqualTo("bodyWeight", 0.80)
.limit(1).get()
val task2=docRef.whereLessThanOrEqualTo("bodyWeight", 0.80)
.limit(1).get()
теперь о том, как это сделать с помощью потока сопрограмм.
Пожалуйста, помогите, спасибо
Комментарии:
1. Что именно сделано? Каков желаемый результат, и на чем вы застряли в достижении этого?
Ответ №1:
Вы должны поместить задачу в CoroutineScope, и все остальное будет таким же, как и раньше.
emit(State.loading())
var eMsg = ""
val docRef = dbRef.collection("FeedInfo/FeedPercent/DOC/")
val task1 = docRef.whereGreaterThanOrEqualTo("bodyWeight", 0.80)
.limit(1).get()
val task2 = docRef.whereLessThanOrEqualTo("bodyWeight", 0.80)
.orderBy("bodyWeight", Query.Direction.DESCENDING)
.limit(1).get()
/** Need to do query Direction here to get correct data*/
coroutineScope {
val allTask: Task<List<QuerySnapshot>> = Tasks.whenAllSuccess(task1, task2)
allTask.addOnSuccessListener {
for (querySnapshot in it) {
for (documentSnapshot in querySnapshot) {
/** Do your code to get the data */
}
}
}.await()
allTask.addOnFailureListener {
eMsg = it.message.toString()
}
/** Emitting flow based on task status **/
if (allTask.isSuccessful) {
emit(State.success(WhatEverItIs))
} else {
emit(State.failed(eMsg))
}
}
}.catch {
emit(State.failed(it.message.toString()))
}.flowOn(Dispatchers.IO)