2017-10-04 103 views
0

我無法弄清楚如何將我的值監聽器指向每個孩子的最後一個節點,如圖所示。Firebase兒童事件監聽器給每個孩子的最後一個節點

img

我想我需要使用childevent監聽器,但我不知道如何將它正確地重定向。

Query searchItemQuery = userDatabaseReference.child(user.getUid()); 
searchItemQuery.addChildEventListener(new ChildEventListener(){ 
    @Override 
    public onChildAdded, onChildChanged, onChildRemoved, onChildMoved, onCancelled 
}); 

回答

0

我建議下來每個item0001item0002,而不是使用火力推ID,可以存儲unix timestamp in millis。這樣,您可以輕鬆地對條目進行排序並獲取每個項目的最後一個子節點。

那麼,這種變化你的數據庫看起來就像

root 
    user 
    uid 
     item0001 
     15089344450000 // this is a timestamp 
      itemdepositdate 
      itemwithdrawdate 

     15989922000000 // another timestamp 
      itemdepositdate 
      itemwithdrawdate 

    item0002 

等等...

現在,對於每一個項目,可以指向最後一個孩子只需通過使用下面的代碼。

FirebaseDatabase database = FirebaseDatabase.getInstance(); 
    database.getReference() 
      .child("root") 
      .child("user") 
      .child("user_id_of_user") 
      .addListenerForSingleValueEvent(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        for (DataSnapshot snapshot : dataSnapshot.getChildren()){ 
         snapshot.getRef().orderByKey().limitToLast(1).addValueEventListener(new ValueEventListener() { 
          @Override 
          public void onDataChange(DataSnapshot dataSnapshot) {         
           dataSnapshot.getValue(); // this is the last itemdepositdate and itemwithdrawaldate for this item 
          } 

          @Override 
          public void onCancelled(DatabaseError databaseError) { 

          } 
         }); 
        } 
       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) { 

       } 
      }); 
+0

由於@uguboz提到,基於時間戳的Firebase推鍵已按時間順序排列,您可以直接運行代碼而無需修改數據庫,它將滿足您的需求。但是,如果你有時間,我建議你修改你的數據庫,因爲你知道密鑰後會更容易傳播物品。 –

+0

謝謝你,它按預期工作,我遵循你的答案使用valueeventlistener而不是childeventlistener,非常感謝你 –

+0

沒問題先生!我的榮幸 :) –

0
Query searchItemQuery = userDatabaseReference 
       .child(user.getUid) 
       .orderByKey() //order nodes w.r.t. the keys 
       .limitToLast(1); //gets last item 
+0

這將只檢索在item10001子節點或將檢索的item10001,item10002等子節點? –

+0

對不起,我錯過了它必須在循環中的一點。但主要想法是讓最後一個節點使用limitToLast(n)獲取最後n個項目。您可以修改代碼來迭代所有item1000x節點並獲取每個節點的最後一項。 – uguboz

+0

orderByKey()如何用於由Firebase生成的隨機推送ID? –

相關問題