在android中加载的页面上加载firebase数据

时间:2017-07-22 04:34:15

标签: android firebase firebase-realtime-database

我搜索了很长时间,我只能找到一个使用addListenerForSingle事件的解决方案,该事件是在onDataChanged上触发的。它仅在数据库发生变化时触发....

如何在加载页面的情况下获得单个值(我的意思是onCreate)?

例如,获取密钥非常简单,

mReference.child("kotran").child("isactive").getKey()
//isactive

但是没有办法获得价值。

2 个答案:

答案 0 :(得分:0)

第一次注册这样的监听器时,

addListenerForSingleValueEvent将被调用一次。 看看整个函数的这个通用Kotlin示例:

override fun <T : Any> getValue(typeClass: KClass<T>, reference: String, vararg children: String): Single<T> =
        Single.create({
            val databaseReference = firebaseDatabase.getReference(reference)

            databaseReference.addListenerForSingleValueEvent(object : ValueEventListener {
                override fun onCancelled(dbError: DatabaseError?) {
                    it.onError(FirebaseDatabaseException(
                            dbError?.message ?: context stringOf R.string.database_error,
                            dbError?.details ?: exceptionDetails(reference, children))
                    )
                }

                override fun onDataChange(dataSnapshot: DataSnapshot?) {
                    val value = childDataSnapshot(dataSnapshot, children)?.getValue(typeClass.java)
                    if (value != null) {
                        it.onSuccess(value)
                    } else {
                        it.onError(RetreivedValueNullException(exceptionDetails(reference, children)))
                    }
                }
            })
        })

它正在返回Single<T>,但是,如果您未使用RxJava,只需删除相关的Single.create换行并返回T

exceptionDetails()的实施:

private fun exceptionDetails(reference: String, children: Array<out String>): String =
        "Exception occurred on reference: $reference and children: ${children.forEach { String.format("-> %s", it) }}"

和用法示例(如果此函数在某些FirebaseRepository中:

firebaseRepository.getValue(Boolean::class, "kotran", "isActive")
    .subscribeOn(Schedulers.io)
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe({ /* do something with the value */}, 
               { /* do something with the error */})

gist提供了更多详细信息。

答案 1 :(得分:0)

Firebase中没有getValue()方法直接在引用上工作,例如getKey()。要获得值,您需要使用侦听器。 onDataChange()方法立即返回当前值。 Here是Firebase的官方文档。请查看listen for value events部分。

希望它有所帮助。