Android Firebase,获取节点中键的位置

时间:2018-05-04 05:20:37

标签: android firebase firebase-realtime-database ranking

我想根据用户的排名获取数据。按用户的第一个顺序排列并获得用户在节点中的位置。但我无法想到实现这一目标的方法。

首先这是我的firebase'用户'节点 enter image description here

也许它会像' databaseRef.child(" users")。orderByChild(" points")...' 我不知道从这里来。

PS。它没有得到第n项。它的项目在哪里' (项目 )

谢谢!

3 个答案:

答案 0 :(得分:2)

请阅读

  

回调函数接收DataSnapshot,它是一个快照   数据。快照是特定数据库中数据的图片   在单个时间点引用。在a上调用val()/ getValue()   snapshot返回特定于语言的对象表示形式   数据。如果参考位置没有数据,则为快照   value为null。

如果您希望获得所有 points ,请检查 LOGIC

DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("products");
    ref.addListenerForSingleValueEvent(
            new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {

                    ArrayList<Integer> points = new ArrayList<>();
                    for (Map.Entry<String, Object> entry : products.entrySet()){
                        Map singleUser = (Map) entry.getValue();
                        points.add((Integer) singleUser.get("points"));
                    }

                }

                @Override
                public void onCancelled(DatabaseError databaseError) {
                    //handle databaseError
                }
            });

答案 1 :(得分:2)

我解决了这个问题。 Android_K.Doe的答案是对的。我在他的代码中添加了一些代码。因为Firebase数据库不提供降序查询。

final Query query = databaseReference.child("users").orderByChild("points");
        query.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                int i = 0;
                int all = (int) dataSnapshot.getChildrenCount();
                Log.d(TAG, "all: " + all);
                for (DataSnapshot ds : dataSnapshot.getChildren()) {

                    String nickName = ds.child("nickName").getValue(String.class);
                    if (nickName.equals(user.getNickName())) {
                        Log.d(TAG, "nickName: " + user.getNickName());
                        int userPlace = i;
                        Log.d(TAG, "position: " + userPlace);
                        myInfoRankingNumTxt.setText(Integer.toString(all - (i)) + "위");
                        break;
                    } else {
                        i++;
                    }
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

答案 2 :(得分:1)

这可以通过在dataSnapshot循环中添加ctr来完成

myRef = FirebaseDatabase.getInstance().getReference().child("users");
final Query query = myRef.orderByChild("points");
query.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {

        int total = dataSnapshot.getChildrenCount();
        int i = 0;
        // loop through dataSnapshot
        for (DataSnapshot childSnapshot : dataSnapshot.getChildren()) {
            String nickName = childSnapshot.child("nickName").getValue(String.class);
            if (nickName.equals(mUser.getNickName()) {
                //when nickName would match
                int userPlace = total - i;
                int points = childSnapshot.child("points").getValue(Interger.class);

                //do something here
                break;
            } else {
                i++;
            }
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});