Есть ли способ получить все объекты в базе данных Firebase в реальном времени с сопрограммами? - PullRequest
0 голосов
/ 30 мая 2019

У меня есть простые объекты в базе данных 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
         }
      }
  }

Ожидайте получить все объекты в БД в реальном времени, но я получил один.

...