我搜索了很长时间,我只能找到一个使用addListenerForSingle事件的解决方案,该事件是在onDataChanged上触发的。它仅在数据库发生变化时触发....
如何在加载页面的情况下获得单个值(我的意思是onCreate)?
例如,获取密钥非常简单,
mReference.child("kotran").child("isactive").getKey()
//isactive
但是没有办法获得价值。
答案 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
部分。
希望它有所帮助。