【发布时间】:2021-11-08 06:52:06
【问题描述】:
所以我使用ViewModel 和LiveData 从我的 Firebase 实时数据库中读取数据。
这是我的ViewModel:
class UsersViewModel : ViewModel() {
private val uid = Firebase.auth.currentUser!!.uid
private val USERS_REF: DatabaseReference = FirebaseDatabase.getInstance().getReference("/users/$uid")
private val liveData: FirebaseQueryLiveData = FirebaseQueryLiveData(USERS_REF)
private val usersLiveData: MediatorLiveData<Users> = MediatorLiveData()
init {
usersLiveData.addSource(liveData, object : Observer<DataSnapshot> {
override fun onChanged(dataSnapshot: DataSnapshot?) {
if (dataSnapshot != null) {
usersLiveData.postValue(dataSnapshot.getValue(Users::class.java))
} else {
usersLiveData.value = null
}
}
})
}
@NonNull
fun getUsersLiveData() : LiveData<Users> {
return usersLiveData
}
}
这是我的LiveData:
class FirebaseQueryLiveData(ref: DatabaseReference) : LiveData<DataSnapshot>() {
private val query: Query = ref
private val listener: MyValueEventListener = MyValueEventListener()
private var listenerRemovePending = false
private val removeListener = object : Runnable {
override fun run() {
query.removeEventListener(listener)
listenerRemovePending = false
}
}
override fun onActive() {
super.onActive()
if (listenerRemovePending) {
Handler(Looper.getMainLooper()).removeCallbacks(removeListener)
} else {
query.addValueEventListener(listener)
}
listenerRemovePending = false
}
override fun onInactive() {
super.onInactive()
Handler(Looper.getMainLooper()).postDelayed(removeListener, 2000)
query.removeEventListener(listener)
}
private inner class MyValueEventListener : ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
value = snapshot
}
override fun onCancelled(error: DatabaseError) {
return
}
}
}
如何从我的数据库中删除数据?我知道我需要在数据库引用上调用removeValue(),但我应该怎么做呢?我的ViewModel 中有数据库引用,所以我想使用该引用来删除数据。
【问题讨论】:
-
这段代码中到底有什么不符合您的预期?
-
@AlexMamo 我不明白你的问题。我试图找出一种删除数据的方法,因为我没有在我的
ViewModel或LiveData中包含该代码。我没有说有什么不好。
标签: android kotlin firebase-realtime-database android-livedata android-viewmodel