无法访问Firebase节点以检索应用的频道列表

问题描述

我具有应更新列表的代码,一旦与Firebase数据库中与该通道相关的所有节点都被删除(除非删除了/ channellist下的该通道节点之后,则不删除该节点),则该代码应先更新列表适配器,然后将notifyDataSetChanged()通知列表适配器,我随后的/ channellist子侦听器无法访问ref.child(“ / channellist / $ channelname”)下的数据。因此出于某些原因,我无法访问/ channellist。

enter image description here

您可以看到/ channel节点下没有channel2,因为它已被删除,并且由于某种原因,channellist下的channel2未被删除

这是我的删除和列表更新功能代码

fun deleteChannel() {
    Log.d("channeltodelete",channelToDelete)
    val messageKeysToDelete = ArrayList<String>()
    fb.child("/channel/$channelToDelete/messages")
        .addListenerForSingleValueEvent(object : ValueEventListener {
            override fun onDataChange(data: DataSnapshot) {
                if (!data.exists()) {
                    deleteChannelHelper(channelToDelete)
                    fb.child("/channel/$channelToDelete").removeValue()
                    return
                }
                // Deletes the messages under /message
                val messagemap = data.getValue(typeindicator2)!!
                for (key in messagemap) {
                    messageKeysToDelete.add(key.key)
                }

                for (key in messageKeysToDelete) {
                    fb.child("message/$key").removeValue()
                }

                // DeleteChannelHelper deletes under user/channels
                deleteChannelHelper(channelToDelete)
                var fb2 = FirebaseDatabase.getInstance().reference

                fb.child("/channel/$channelToDelete").removeValue()

                **// This is the line of code that doesn't work
                fb2.child("/channellist/$channelToDelete").removeValue()**
            }

            override fun onCancelled(databaseError: DatabaseError) {
                // report/log the error
            }
        }

fun processChannelListData(data: DataSnapshot) {
    Log.d("channellistlistener",data.key + ": " + data.value)
    val channelnames = data.children.toMutableList()
    var channels = ArrayList<String>()
    var channelsToDelete = ArrayList<String>()
    for (channel in channelnames) {
        channels.add(channel.key.toString())
    }
    Log.d("channelnameslistener",channels.toString())

    // If a channel was added
    for (channel in channels) {
        if (channel !in channelList) {
            channelList.add(channel)
        }
    }

    // If a channel was deleted
    for (channel in channelList) {
        if (channel !in channels) {
            channelsToDelete.add(channel)
        }
    }

    channelList.removeAll(channelsToDelete)
    Log.d("chanList removeall",channelList.toString())

    myAdapter.notifyDataSetChanged()
}

我要注意的是,放置在/ channellist上的ChildEventListener不仅在/ channellist节点上触发多次,在所有子节点上也会触发一次原因,并弄乱了全局channelList,因为如果最后访问的节点是test1,则它看起来像

2020-09-14 16:26:18.734 24448-24523/com.example.treechat D/channellistlistener: test1: -MGyjrKRLmc-wPLAjvR-
2020-09-14 16:26:18.734 24448-24523/com.example.treechat D/channelnameslistener: []
...
2020-09-14 16:26:18.734 24448-24523/com.example.treechat D/chanList removeall: []

如果代码只是顶级节点,那就没问题了

2020-09-14 16:26:18.733 24448-24520/com.example.treechat D/channellistlistener: channellist: {channel1=-MHCK1wp8mBUi_bJzxZ-,channel2=-MHdam_k2no7ZLtUYTIU,test1=-MGyjrKRLmc-wPLAjvR-}
2020-09-14 16:26:18.733 24448-24520/com.example.treechat D/channelnameslistener: [channel1,channel2,test1]
...
2020-09-14 16:26:18.733 24448-24520/com.example.treechat D/chanList removeall: [channel1,test1]

通过这种方式,我在创建频道时访问/ channellist不会遇到问题,因为您可以看到节点创建得很好。但是由于某种原因,我在执行该操作时该应用会崩溃,而不是从ChannelListActivity-> ChannelActivity转到,而是从ChannelListActivity-> ChannelActivity-> mini-crash-> ChannelListActivity退出。我将其发布在一个单独的问题中,但是没有致命的异常日志。

解决方法

我恢复为/ channellist使用ValueEventListener而不是ChildEventListener。

我发现,使用HashMap ()并将路径为null的值作为我要删除的所有位置的值,可以一次删除所有节点,包括通道列表中的节点。拥有HashMap后,您需要在数据库引用上调用updateChildren(HashMap)。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...