Java 如何从Firebase获取特定的子值?

Java 如何从Firebase获取特定的子值?,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我只想获取player1Name并分配给Stringplayer1Name。但是我从下面的代码中得到null,请帮助 Firebase基本设置:100%处理此部件 UserId = FirebaseAuth.getInstance().getCurrentUser().getUid(); DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference(); DatabaseReference gameInfoRef

我只想获取
player1Name
并分配给String
player1Name
。但是我从下面的代码中得到
null
,请帮助

Firebase基本设置:100%处理此部件

UserId = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference gameInfoRef = rootRef.child("user").child(UserId).child("gameInfo");
gameKey = "LMr4xql36nPZFvyX5n9";
ValueEventListener

gameInfoRef.child(gameKey).addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {

        TextView tv_player1Name = findViewById(R.id.tv_player1Name);

        for (DataSnapshot ds : dataSnapshot.getChildren()) {

            Game game = ds.child(gameKey).getValue(Game.class);

            player1Name = ds.child("player1Name").getValue(String.class);
        }
     System.out.println(ds.child(gameKey).getValue() +"  =All Data");
     }
});
09-20 21:38:14.980 4274-4274/viwil.mahjongcal I/System.out: null    All Data
System.out.println

gameInfoRef.child(gameKey).addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {

        TextView tv_player1Name = findViewById(R.id.tv_player1Name);

        for (DataSnapshot ds : dataSnapshot.getChildren()) {

            Game game = ds.child(gameKey).getValue(Game.class);

            player1Name = ds.child("player1Name").getValue(String.class);
        }
     System.out.println(ds.child(gameKey).getValue() +"  =All Data");
     }
});
09-20 21:38:14.980 4274-4274/viwil.mahjongcal I/System.out: null    All Data
这也不起作用:

player1Name = game.getPlayer1Name()
此错误:

java.lang.NullPointerException:尝试对空对象引用调用虚拟方法“java.lang.String viwil.mahjongcal.Game.getPlayer2Name()”

当我换这行的时候

gameInfoRef.child(gameKey).addValueEventListener(new ValueEventListener() {


System.out.println
将打印所有数据(包括我想要的字符串),而不考虑
gameKey
,但是我想要
player1Name
在我指定的
子系统(“gameKey”)
中,请帮助。

push()
方法生成的ID,以
-
(减号)开始。因此,要解决此问题,请更改以下代码行:

gameKey = "LMr4xql36nPZFvyX5n9";
Game game = dataSnapshot.getValue(Game.class);
Log.d(TAG, game.getPlayer1Name());

当您使用对该特定id的直接引用时,不需要使用
getChildren()
方法循环通过
DataSnapshot
对象,您只需从其中获取值即可。因此,删除for循环并仅使用以下代码行:

gameKey = "LMr4xql36nPZFvyX5n9";
Game game = dataSnapshot.getValue(Game.class);
Log.d(TAG, game.getPlayer1Name());
日志中的结果将是:

testttggg

push()
方法生成的ID以
-
开头(减号)。因此,要解决此问题,请更改以下代码行:

gameKey = "LMr4xql36nPZFvyX5n9";
Game game = dataSnapshot.getValue(Game.class);
Log.d(TAG, game.getPlayer1Name());

当您使用对该特定id的直接引用时,不需要使用
getChildren()
方法循环通过
DataSnapshot
对象,您只需从其中获取值即可。因此,删除for循环并仅使用以下代码行:

gameKey = "LMr4xql36nPZFvyX5n9";
Game game = dataSnapshot.getValue(Game.class);
Log.d(TAG, game.getPlayer1Name());
日志中的结果将是:

testttggg

@DudeCoder不仅仅是打字错误,OP从数据库获取数据的方式也是如此。不需要那个循环。@AlexMamo。。。是的,我只是一直读这个问题直到
gameKey
得到一个赋值。。。然后我发现了错误,没有阅读further@DudeCoder不仅仅是打字错误,OP从数据库获取数据的方式也是如此。不需要那个循环。@AlexMamo。。。是的,我只是一直读这个问题直到
gameKey
得到一个赋值。。。然后我发现了这个错误,并没有像往常那样值得信赖地阅读:D谢谢兄弟!删除for循环后效果非常好!gameKey是我在简化代码时犯的粗心错误,我实际上是出于意图,但你也注意到了细节!一如既往地值得信赖:D谢谢兄弟!删除for循环后效果非常好!gameKey是我在简化代码时犯的粗心错误,我实际上是出于意图,但你也注意到了细节!