在android中加载页面加载firebase数据
我搜索了很长时间,我只能找到一个解决方案使用addListenerForSingle事件触发onDataChanged。 它只在数据库发生变化时触发。
我怎样才能得到一个页面加载的单个值(我的意思是onCreate)?
例如,获取密钥真的很容易,
mReference.child("kotran").child("isactive").getKey() //isactive
但是没有办法获得价值。
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 */})
更多细节可以在这个要点 。
Firebase中没有getValue()
方法,它直接在引用上工作,如getKey()。 要获得一个值,你需要使用一个监听器。 onDataChange()
方法立即返回当前值。 这里是来自Firebase的官方文档。 请检查listen for value events
部分。
希望它有帮助。