我正在使用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。
有没有人遇到过类似的错误?
答案 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?) { ... }