2017-09-26 26 views
0

我試圖做一些基本的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(),但結果仍然相同。

回答

2

通常,使用幾個setValue操作編寫一個對象的多個屬性時,Firebase會再現這樣的問題。我建議以下情形:

  1. 訂單添加到\ordersonChildAdded被調用,但這是因爲它的cooked屬性爲false空。
  2. Cooked屬性設置爲falseonChildUpdated將根據您的需要進行調用。

也許這不是你所做的,而只是它如何在引擎蓋下實現。也許你可以使用onChildUpdated

+0

我想我可以在onChildChanged中做些事情,但我不明白爲什麼onChildAdded沒有我的數據,因爲聽衆正在尋找未煮熟的訂單。隨後的setValue()調用按預期方式工作,但在沒有未煮熟的訂單時不會第一次調用。 – Daan

+0

僅僅因爲第一次查詢處理在Firebase SDK中以不同方式實現。 –