2017-07-26 2 views
0

私はFirebaseのWeb顧客のリストを管理するためにKotlinを使ってサーバー側のアプリケーションを開発しています。私は正常にJava Firebase Admin SDKをKotlinに追加し、Realtime Databaseとの機能的な接続を得ました。KotlinのFirebase SDK - onChildChangedがリストの最初の子に発砲しない

しかし、私はちょうど1つの問題に気づいた。私は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 paramsに注意を向けました。問題がありました。

"?"のない変数で非null参照を許可しないというKotlinのデフォルトの動作が与えられています。最後に、onChildChangedメソッドは、そのfirstChildNameが実際にはnullだったので、最初のアイテムでのみ発生しませんでした。

だから、p1: Stringp1: String?に変更して問題を解決しました。

それは次のように動作しませんでした:

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

それは

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

p1 : String?ではなくp1 : Stringを使用しているため、この問題が発生しています。文字列は実際にはpreviousChildNameであり、それがあなたがそれを得ている理由です。

KotlinはNullPointerExceptionを持っていないので、実際には、このような文字列の後に疑問符(?)を使用することです:p1: String?

はそれがお役に立てば幸いです。

+0

!:このように動作し、あなたが見るように申し訳ありませんが、私のpreviousChildNameは全てP1と呼ばれ、二回私のコードをチェックした後、私はどこでそれを使ったのかわかりません。私は常にDataSnapshotであるp0だけを呼び出しています。 あなたが話している正確なラインを教えてください。 – Olmectron

+0

ちょっと遅いですが、それを理解してください。私の更新された答えを見てください。 –

関連する問題