Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Can';t访问Firebase节点以检索应用程序的频道列表_Android_Firebase_Kotlin_Firebase Realtime Database_Persistence - Fatal编程技术网

Android Can';t访问Firebase节点以检索应用程序的频道列表

Android Can';t访问Firebase节点以检索应用程序的频道列表,android,firebase,kotlin,firebase-realtime-database,persistence,Android,Firebase,Kotlin,Firebase Realtime Database,Persistence,我的代码应该在删除Firebase数据库中与通道相关的所有节点后更新列表,然后将notifyDataSetChanged()通知列表适配器,除非在删除/channellist下的通道节点后未被删除,并且我的/channellist的后续子侦听器无法访问ref.child(“/channellist/$channelname”)下的数据。因此,由于某些原因,我无法访问/channellist 您可以看到/channel节点下没有channel2,因为该节点已被删除,并且由于某些原因channel

我的代码应该在删除Firebase数据库中与通道相关的所有节点后更新列表,然后将notifyDataSetChanged()通知列表适配器,除非在删除/channellist下的通道节点后未被删除,并且我的/channellist的后续子侦听器无法访问ref.child(“/channellist/$channelname”)下的数据。因此,由于某些原因,我无法访问/channellist

您可以看到/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()
}
然而,如果只是顶层节点,那么代码就可以了

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, channel2, test1]

顺便说一句,我在创建通道时访问/channellist没有问题,因为您可以看到节点创建得很好。但由于某种原因,当我这么做时,应用程序崩溃了,而不是从ChannelListActivity->ChannelActivity,而是从ChannelListActivity->ChannelActivity->mini crash->ChannelListActivity。我将在一个单独的问题中发布,但没有致命的异常日志。

我恢复使用ValueEventListener for/channellist,而不是ChildEventListener

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

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, channel2, test1]