我試圖做一些基本的Firebase操作,但是childEventListener的行爲並不像預期的那樣。Firebase onChildAdded返回空數據,然後在更新子代後返回onChildChanged
我有一個使用Firebase查詢和ChildEventListener在列表中顯示的餐館訂單列表。該查詢用於獲取所有未烹飪的訂單,即WHERE cooked = false。
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()按預期調用,但訂單對象數據爲空。之後,我還通過訂單對象數據獲取onChildChanged調用。
當我繼續敲煮熟的訂單時,它會根據預期調用一次正確數據的onChildAdded()。所以在技術上,我錯過了由於空數據而被煮熟的第一個訂單。
如果我加載具有一個或多個未煮熟訂單的活動,並點擊已煮熟的訂單,則會按預期方式調用onChildAdded()並更新未煮熟訂單的列表。
我嘗試將setValue()更改爲updateChildren(),但結果仍然相同。
我想我可以在onChildChanged中做些事情,但我不明白爲什麼onChildAdded沒有我的數據,因爲聽衆正在尋找未煮熟的訂單。隨後的setValue()調用按預期方式工作,但在沒有未煮熟的訂單時不會第一次調用。 – Daan
僅僅因爲第一次查詢處理在Firebase SDK中以不同方式實現。 –