У меня есть простые объекты в базе данных Firebase Realtime, и мне нужно извлечь все эти объекты и сохранить их как локальную переменную, чтобы отправить их другим классам , так как я могу это сделать с сопрограммами?
Я пытался создать функцию расширения типов Deferrd
затем вызвать эту функцию с асинхронной областью
мой код:
fun Query.toDeferred(): Deferred<DataSnapshot> {
val deferred = CompletableDeferred<DataSnapshot>()
this.addValueEventListener(object : ValueEventListener {
override fun onCancelled(p0: DatabaseError) {
Log.i("xyz","onCancelled throw exception ${p0.message}")
}
override fun onDataChange(dataSnapshot: DataSnapshot) {
deferred.complete(dataSnapshot)
//Also try this , but not work
dataSnapshot.children.forEach {
val obj = it.getValue(Stickers::class.java)
listOfStickers.add(obj!!)
deferred.complete(dataSnapshot)
}
}
})
return deferred
}
Расширение запроса вызова.
fun fetchStickers() : Deferred<List<Stickers>> {
val ref = FirebaseDatabase.getInstance().getReference("stickers")
return GlobalScope.async(Dispatchers.IO) {
withContext(this.coroutineContext) {
val data = ref.toDeferred().await()
val sticker = data.getValue(Stickers::class.java)
listOfStickers.add(sticker!!)
return@withContext listOfStickers
}
}
}
Ожидайте получить все объекты в БД в реальном времени, но я получил один.