2017-07-26 14 views
0

我正在开发一个服务器端应用程序,使用Kotlin来管理Firebase中的Web客户列表。我已成功将Java Firebase Admin SDK添加到我的Kotlin,并与我的实时数据库建立了功能性连接。Kotlin的Firebase SDK - onChildChanged没有对名单中的第一个孩子开火

但是,我只注意到一个问题。我添加了一个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 !!!!!!!!!!!!!!!!!!") 

     } 


    }) 

我想可能会有一些问题,在我的客户的数据,所以它崩溃,甚至没有抛出异常,但增加了对检查ChildChanged回调单一的println被解雇后,甚至,它不会做与列表中的第一个客户的东西!

我在过去为Java(没有Kotlin)做过类似的代码,它们一直很棒。

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

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

回答

0

感谢@Alex Mamo的评论,我将我的注意力转移到了previousChildName参数上,并且出现了让我困住了好几个小时的问题!

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

因此,我将p1: String更改为p1: String?并解决问题!

它没有像这样工作:

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

是这样工作的!:

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

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

因为科特林没有NullPointerException,实践是字符串这样以后使用问号(?):p1: String?

希望它能帮助。

+0

对不起,你看,我的previousChildName都称为P1,并检查我的代码后两次我不知道我在哪里使用它。我总是只调用p0,这是DataSnapshot。 请你指点一下你正在谈论的确切线路? – Olmectron

+0

有点晚了,但弄清楚了。请看我更新的答案。 –

相关问题