Firebase数据顺序

时间:2018-02-10 11:04:05

标签: java android firebase firebase-realtime-database

我有一个课程如下所示:

public class GlobalHighScore {
String name;
int score;

public GlobalHighScore(String name, int score) {
    this.name = name;
    this.score = score;
}


public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public int getScore() {
    return score;
}

public void setScore(int score) {
    this.score = score;
}
}

在这里,我尝试接收数据。

DatabaseReference scoresRef = firebaseDatabase.getReference("Highscores");    
scoresRef.child("GlobalHighScore").orderByChild("score").limitToFirst(10);
    scoresRef.addValueEventListener(new ValueEventListener() {
        @Override public void onDataChange(DataSnapshot dataSnapshot) {
            Iterable<DataSnapshot> keys = dataSnapshot.getChildren();
            int i = 0;
            for (DataSnapshot key : keys) {
                if(i == 10)
                    break;
                orderName[i].setText(key.getValue().toString());
                i++;
            }
        }

当我这样做时,key.getValue().toString()返回json格式的字符串,但我想要“名字”和“得分”分开。此外,尽管我对数据进行了排序,但我的数据并未排序。

scoresRef.child("GlobalHighScore").orderByChild("score").limitToFirst(10);

我想我在这里有问题。

编辑:当我按“得分”排序时,它会根据日期提供数据。

最后一种形式是

 final TextView[] orderScore = {firstscore, secondscore, thirdscore, fourthscore, fifthscore, sixthscore, seventhscore, eightscore, ninthscore, tenthscore};
    final TextView[] orderName = {firstname, secondname, thirdname, fourthname, fifthname, sixthname, seventhname, eightname, ninthname, tenthname};

    DatabaseReference scoresRef = firebaseDatabase.getReference("Highscores").child("GlobalHighScore");
    scoresRef.orderByChild("score").limitToFirst(10);
    scoresRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            int i = 0;
            for (DataSnapshot data : dataSnapshot.getChildren()) {
                if(i == 10)
                    break;
                String name = data.child("name").getValue().toString();
                String score = data.child("score").getValue().toString();
                orderName[i].setText(name);
                orderScore[i].setText(score);
                i++;
            }
        }

根本没有提供数据记录。

2 个答案:

答案 0 :(得分:1)

试试这个:

 DatabaseReference scoresRef = firebaseDatabase.getReference("Highscores").child("GlobalHighScore");
Query q=scoresRef.orderByChild("score").limitToFirst(10);    
q.addValueEventListener(new ValueEventListener() {
    @Override public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot data : dataSnapshot.getChildren()){
          String name=datas.child("name").getValue().toString();
          String score=datas.child("score").getValue().toString();
        }
    }

由于您只需要名称和分数,您可以执行上述操作,以便能够单独检索它们。

.orderByChild("score").limitToFirst(10);,使用此功能,您将获得前10个包含子score的节点。

limitToFirst(10) //to get the first 10 of a specific child

limitToLast(10) //to get the Last 10 of a specific child

答案 1 :(得分:0)

当您使用以下代码行时:

Iterable<DataSnapshot> keys = dataSnapshot.getChildren();

迭代时你得到的孩子是实际的对象,而不是字符串。使用toString()方法没有任何意义,因为您无法将Object强制转换为String并期望获取其中的值。这就是为什么你得到“json格式化的字符串”。那么迭代时你得到的是实际的地图。因此,要获得namescore,您需要遍历地图并使用:map.get("name");map.get("score");

您无需更改整个代码,您的代码也可以。只是解决这个小问题。