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
并分配给Stringplayer1Name
。但是我从下面的代码中得到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是我在简化代码时犯的粗心错误,我实际上是出于意图,但你也注意到了细节!