我有一个课程如下所示:
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++;
}
}
根本没有提供数据记录。
答案 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格式化的字符串”。那么迭代时你得到的是实际的地图。因此,要获得name
和score
,您需要遍历地图并使用:map.get("name");
和map.get("score");
。
您无需更改整个代码,您的代码也可以。只是解决这个小问题。