我想根据用户的排名获取数据。按用户的第一个顺序排列并获得用户在节点中的位置。但我无法想到实现这一目标的方法。
也许它会像' databaseRef.child(" users")。orderByChild(" points")...' 我不知道从这里来。
PS。它没有得到第n项。它的项目在哪里' (项目 )
谢谢!
答案 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) {
}
});