基本的な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()に変更しようとしましたが、同じ結果が得られました。
私はonChildChangedで何かできると思いますが、なぜなら、リスナーが調理されていないオーダーを探しているので、なぜonChildAddedにデータがないのか分かりません。後続のsetValue()呼び出しは、期待どおりに動作しますが、調理されていないオーダーがない場合は初めて動作しません。 – Daan
最初のクエリ処理がFirebase SDKで異なって実装されているからです。 –