Java 检索firebase实时数据库中节点下的所有数据

Java 检索firebase实时数据库中节点下的所有数据,java,firebase-realtime-database,Java,Firebase Realtime Database,我有一个firebase实时数据库,希望使用这些数据制作排行榜。我正在尝试检索“我的分数”节点中的所有数据,但不确定如何循环获取所有用户的分数 数据库结构如下: 我尝试使用的代码如下: package com.example.securityapp; import androidx.appcompat.app.AppCompatActivity; import android.nfc.Tag; import android.os.Bundle; import android.util.Lo

我有一个firebase实时数据库,希望使用这些数据制作排行榜。我正在尝试检索“我的分数”节点中的所有数据,但不确定如何循环获取所有用户的分数

数据库结构如下:

我尝试使用的代码如下:

package com.example.securityapp;

import androidx.appcompat.app.AppCompatActivity;

import android.nfc.Tag;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;
import com.google.firebase.database.ValueEventListener;

import static java.lang.System.in;

public class leaderboard extends AppCompatActivity {

    DatabaseReference databaseUsers;
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    FirebaseAuth mAuth;
    TextView score;
    private static final String TAG = "leaderboard";



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_leaderboard);

        databaseUsers = database.getReference().child("Scores");
        mAuth = FirebaseAuth.getInstance();
        FirebaseUser user = mAuth.getCurrentUser();
        score = (TextView) findViewById(R.id.leaderboard_score);


        databaseUsers.child("Scores").addValueEventListener(new ValueEventListener() {
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                        System.out.println("The scores are " + dataSnapshot.child("Points").getValue().toString());
                    }
                }


            @Override
            public void onCancelled(DatabaseError databaseError) {
             // Getting Post failed, log a message
             Log.w(TAG, "loadPost:onCancelled", databaseError.toException());

    }


});

        }
}

似乎您正在使用“Listener”类访问数据并打印分数。您附加的“ValueEventListener”侦听器实现了“onDataChange()”方法,在数据发生更改之前不会被调用


我不确定您是如何使用这个类的,但根据您的问题,我假设您只想在执行“leadboard.onCreate()”方法时打印分数。这是正确的吗?如果是这种情况,您可能不需要附加侦听器。

您的JSON太深了一层,正在读取
/Points/Points
。由于该节点不存在,因此在
onDataChange
中会得到一个空快照

database.getReference().child("Scores").addValueEventListener(new ValueEventListener() {
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
            Log.i(TAG, "The scores are " + dataSnapshot.child("Points").getValue(Long.class));
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.w(TAG, "loadPost:onCancelled", databaseError.toException());
    }
});
返回值的新代码:

公共类排行榜扩展AppCompative活动{
数据库参考数据库用户;
FirebaseDatabase=FirebaseDatabase.getInstance();
FirebaseAuth mAuth;
文本视图分数;
私有静态最终字符串TAG=“排行榜”;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_排行榜);
mAuth=FirebaseAuth.getInstance();
FirebaseUser=mAuth.getCurrentUser();
分数=(TextView)findViewById(R.id.tableText);
database.getReference().child(“分数”).addValueEventListener(新的ValueEventListener()){
公共void onDataChange(DataSnapshot DataSnapshot){
对于(DataSnapshot快照:DataSnapshot.getChildren()){
System.out.println(“分数为:+snapshot.toString());
score.setText(snapshot.toString());
}
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
//获取Post失败,请记录消息
w(标记“loadPost:onCancelled”,databaseError.toException());
}
});
}

}
感谢您的回复!就是这样。当用户从菜单中单击“排行榜”时,我需要在排行榜屏幕上显示高分。我想从firebase中检索这些值,并将其显示在排行榜屏幕的表格中OK,酷。您是否在没有侦听器的情况下尝试了该代码?“
onDataChange()
方法……在数据发生更改之前不会被调用。”这是不正确的。From:“您可以使用
onDataChange()
方法读取给定路径中内容的静态快照,就像事件发生时存在的一样。此方法在附加侦听器时触发一次,每次数据(包括子项)更改时都会触发一次。”@如果没有valueListener,代码应该是什么样子?我现在可以返回分数了,但是我想知道,是否仍然可以只返回分数,而不返回ID键?请查看编辑以了解我的进度