【问题标题】:How do I delete data in my Firebase Realtime Database when using a ViewModel and LiveData?使用 ViewModel 和 LiveData 时如何删除 Firebase 实时数据库中的数据?
【发布时间】:2021-11-08 06:52:06
【问题描述】:

所以我使用ViewModelLiveData 从我的 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 我不明白你的问题。我试图找出一种删除数据的方法,因为我没有在我的ViewModelLiveData 中包含该代码。我没有说有什么不好。

标签: android kotlin firebase-realtime-database android-livedata android-viewmodel


【解决方案1】:

根据 MVVM,您可以拥有一个带有删除方法的存储库类,您可以从视图模型类中调用该方法。然后你可以使用 livedata 来观察视图的进度变化。

删除:

val databaseReference = FirebaseDatabase.getInstance().getReference().child("quotes").child(fieldKey)
databaseReference.removeValue()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多