Kotlin中的Firebase SDK - onChildChanged不会在列表中的第一个子项上触发

时间:2017-07-26 16:44:04

标签: java firebase firebase-realtime-database listener kotlin

我正在使用Kotlin开发服务器端应用程序来管理Firebase中的Web客户列表。我已成功将Java Firebase Admin SDK添加到我的Kotlin,并与我的实时数据库建立了功能连接。

但是,我刚发现一个问题。我添加了一个ChildEventListener来监听他们数据的更改,它对每个客户都很好,但是列表中的第一个客户。无论我是否使用" orderBy"订购数据,第一个查询的项目在数据库中实际编辑时都不会收到ChildChanged回调。

var ref=FirebaseDatabase.getInstance().getReference("web-
customers").orderByChild("displayName")
    ref.addChildEventListener(object:ChildEventListener{
        override fun onCancelled(p0: DatabaseError?) {
                if(p0!=null)
            println(p0.message)
        }

        override fun onChildMoved(p0: DataSnapshot?, p1: String?) {

            println("A child moved !!!!!!!!!!!!!!!!!!")
        }

        override fun onChildChanged(p0: DataSnapshot, p1: String) {
                println("A child changed !!!!!!!!!!!!!!!!!!")
                val key=p0.key as String
                println("A customer changed: "+key)
                for(value:HashMap<String,Any> in list){
                    println(value.get(".key") as String+": "+value.get("displayName") as String)
                    if((value.get(".key") as String).equals(key)){
                        val valor=p0.value as HashMap<String,Any>

                        for(llave in valor.keys){
                            val dato=valor.get(llave) as Any

                            value.put(llave,dato)

                        }

                        println("Customer "+valor.get("displayName") as String+" modified!!!!!!")
                        refresh()
                        break
                    }
                }

        }

        override fun onChildAdded(p0: DataSnapshot, p1: String?) {

            println("A child added !!!!!!!!!!!!!!!!!!")
            val value=p0.value as HashMap<String,Any>
            value.put(".key",p0.key as String)
            list.add(value)
        }

        override fun onChildRemoved(p0: DataSnapshot?) {
            println("A child removed !!!!!!!!!!!!!!!!!!")

        }


    })

我认为我的客户数据可能存在一些问题,所以它甚至没有抛出异常就崩溃了,但即使添加了一个println用于检查ChildChanged回调被触发,它也没有做任何事情列表中的第一个客户!

我过去为Java做过类似的代码(没有Kotlin),而且他们总是很棒。

我使用的是最新的Firebase Java SDK版本5.2.0。

有没有人遇到过类似的错误?

2 个答案:

答案 0 :(得分:1)

这种情况正在发生,因为您使用的是p1 : String,而不是p1 : String?。字符串实际上是previousChildName,这就是你得到它的原因。

因为Kotlin没有NullPointerException,所以练习是在字符串之后使用问号(?),如下所示:p1: String?

希望它有所帮助。

答案 1 :(得分:0)

感谢@Alex Mamo发表的评论,我将注意力转移到了以前的孩子名称参数上,并且存在让我陷入困境数小时的问题!

考虑到Kotlin的默认行为,即在没有“?”的变量中不允许非空引用最后,onChildChanged方法不仅仅在我的第一个项目上被触发,因为它的previousChildName实际上是null。

所以,我将p1: String更改为p1: String?并解决了问题!

它不能像这样工作:

override fun onChildChanged(p0: DataSnapshot, p1: String) { ... }

它以这种方式工作!:

override fun onChildChanged(p0: DataSnapshot, p1: String?) { ... }