2017-10-04 100 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? –

相关问题