如何从Firebase(java)检索最后一个孩子?

时间:2018-08-22 19:35:40

标签: java android firebase firebase-realtime-database

DatabaseReference lastRef = FirebaseDatabase.getInstance().getReference().child("Ranklist");
Query lastQuery = lastRef.orderByKey().limitToLast(1);
lastQuery.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot data) {
        newUser.Rank=Long.parseLong(data.getKey().toString())+1;

        OrderConsoleMessages();
        texts[0].setText("Last Rank is: "+newUser.Rank+" | UID: " + data.getValue());
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        OrderConsoleMessages();
        texts[0].setText(databaseError.toString());
    }
});

我的问题是如何从“排名列表”中检索最后一个孩子?我尝试使用orderByKey ByValue,但在我的情况下没有任何效果。我没有收到任何错误,我想我根本没有从该查询中获得任何数据。

https://image.ibb.co/joKwCe/image.png

编辑:这是我从data.getValue()。toString->>> {4 = somekey4}中得到的

3 个答案:

答案 0 :(得分:1)

您的代码正常工作。我测试了您对数据库的查询返回了父节点“ Ranklist”的最后一个子节点。将您的DatabaseReference dbref设置为全球成员

dbRef = FirebaseDatabase.getInstance().getReference().child("Ranklist");
Query lastQuery = dbRef.orderByKey().limitToLast(1);
lastQuery.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
     for(DataSnapshot data : dataSnapshot.getChildren())
     {
       //if you call methods on dataSnapshot it gives you the required values
       String s = data.getValue(); // then it has the value "somekey4" 
       String key = data.getKey(); // then it has the value "4:"
       //as per your given snapshot of firebase database data 
      }
}

@Override
public void onCancelled(DatabaseError databaseError) {

}});

希望这对您有帮助...

快乐编码:-)

答案 1 :(得分:0)

在这种情况下,您不能使用查询。正如我在您的屏幕快照中看到的那样,Ranklist节点是一个ArrayList,要获取Ranklist节点下的最后一个孩子的值,即somekey4,请使用以下命令代码行:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference ref = rootRef.child("Ranklist");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        ArrayList<String> arrayList = (ArrayList<String>) dataSnapshot.getValue();
        String lastItem = arrayList.get(arrayList.size() - 1);
        Log.d("TAG", lastItem);
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage());
    }
};
ref.addListenerForSingleValueEvent(valueEventListener);

您的logcat中的输出将为:somekey4

答案 2 :(得分:0)

您的代码是正确的,但是您仅获得“最后一个节点的密钥”。因此,您需要使用以下方式进行更改:

dbRef.child("Ranklist")
 .orderByChild(Constants.ARG_CONV_TIMESTEMP)
 .limitToLast(1)
 .addChildEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        String value = dataSnapshot.getValue(); 
        String key = dataSnapshot.getKey(); 
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }});