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

时间:2018-09-20 13:40:31

标签: java android firebase firebase-realtime-database

我只想获取player1Name并分配给字符串player1Name。但是我从以下代码中得到了null,请帮忙!

Firebase data tree:

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");
     }
});

System.out.println

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() {

收件人

gameInfoRef.addValueEventListener(new ValueEventListener() {

System.out.println将打印所有数据(包括我想要的字符串),而不考虑gameKey,但我想在我指定的player1Name中放入child("gameKey"),请帮忙。

1 个答案:

答案 0 :(得分:3)

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

gameKey = "LMr4xql36nPZFvyX5n9";

gameKey = "-LMr4xql36nPZFvyX5n9";
//         ^

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

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

您的logcat中的结果将是:

testttggg