2017-09-26 3 views
0

基本的なFirebase操作を実行しようとしていますが、childEventListenerが期待どおりに動作していません。Firebase onChildAddedはnullデータを返し、次に子を更新した後にonChildChangedを返します。

私はFirebaseクエリとChildEventListenerを使用してリストに表示するレストラン注文のリストを持っています。この照会は、調理されていないすべての注文、すなわち調理=偽の注文を得るために使用される。

FirebaseDatabase mFirebaseDatabase = FirebaseDatabase.getInstance(); 
mDatabaseReference = mFirebaseDatabase.getReference().child(UUID + "/" + outletID + "/orders"); 
Query query = mDatabaseReference.orderByChild("cooked").equalTo(false); 

mChildEventListener = new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String s) { 

      Log.e(TAG, "ChildEventListener() - onChildAdded - " + dataSnapshot.getKey()); 

      Order order = dataSnapshot.getValue(Order.class); 
      mAdapter.addOrder(order); 
     } 

     @Override 
     public void onChildChanged(DataSnapshot dataSnapshot, String s) { 

      Log.e(TAG, "ChildEventListener() - onChildChanged - " + dataSnapshot.getKey()); 

      Order order = dataSnapshot.getValue(Order.class); 
      mAdapter.updateOrder(order); 
     } 

     @Override 
     public void onChildRemoved(DataSnapshot dataSnapshot) { 

      Log.e(TAG, "ChildEventListener() - onChildRemoved - " + dataSnapshot.getKey() + ", exist - " + dataSnapshot.exists()); 

      Order order = dataSnapshot.getValue(Order.class); 
      mAdapter.removeOrder(order); 
     } 

     @Override 
     public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

      Log.e(TAG, "ChildEventListener() - onChildMoved - " + dataSnapshot.getKey()); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

      Log.w(TAG, "ChildEventListener : onCancelled - ", databaseError.toException()); 
     } 
    }; 

    query.addChildEventListener(mChildEventListener); 

これは正常に動作し、適切なデータを取り出します。

私は、調理されたすべての注文、すなわち調理=真実を得る別のリストを持っています。私はこれにワンタイムイベントリスナーを使用し、正しいデータを期待どおりに表示します。調理された注文の私のリストで

Query query = mDatabaseReference.orderByChild("cooked").equalTo(true); 

ユーザーが順番にタップしたとき、戻って「偽」に調理されたフラグを更新し、未調理の受注の一覧に表示されるように意図されています。次のsetValue()メソッドを使用して行います。

mDatabaseReference.child(order.getPushID()).child("cooked").setValue(false); 

問題1

私は活動をロードし、何の未調理のオーダーが存在しない場合は、問題が発生した場合には、これがあります。調理された注文をタップすると、Firebaseデータベースはcookedフラグを期待通りに更新しますが、onChildAdded()は期待通りに呼び出されますが、注文オブジェクトのデータはnullです。私はまた、注文オブジェクトデータとの後にonChildChanged呼び出しを取得します。

調理された注文をタップすると、onChildAdded()が1回だけ正しいデータで呼び出されます。技術的には、ヌルデータのために調理された最初の注文が不足しています。

調理されていない注文が1つ以上あるアクティビティを読み込み、調理された注文をタップすると、onChildAdded()が期待通りに呼び出され、調理されていない注文のリストが更新されます。

私はsetValue()をupdateChildren()に変更しようとしましたが、同じ結果が得られました。

答えて

2

通常、このような問題は、いくつかのsetValue操作を使用して1つのオブジェクトのいくつかのプロパティを書き込むと、Firebaseで再現されます。私は、次のシナリオを提案:

  1. 注文は、\ordersに追加されonChildAddedが呼び出されますが、そのcookedプロパティがfalseあるのため、これは空です。
  2. Cookedプロパティがfalseに設定されています。 onChildUpdatedが必要な順番で呼び出されます。

おそらくこれはあなたがしているのではなく、それがどのように実装されているのかということです。たぶんonChildUpdatedを使うことができますか?

+0

私はonChildChangedで何かできると思いますが、なぜなら、リスナーが調理されていないオーダーを探しているので、なぜonChildAddedにデータがないのか分かりません。後続のsetValue()呼び出しは、期待どおりに動作しますが、調理されていないオーダーがない場合は初めて動作しません。 – Daan

+0

最初のクエリ処理がFirebase SDKで異なって実装されているからです。 –

関連する問題