首页 > 解决方案 > 如何从 Firebase 获取特定的子值?

问题描述

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

Firebase 数据树:

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"),请帮忙。

标签: javaandroidfirebasefirebase-realtime-database

解决方案


该方法生成的 id以(减号)push()开头。-所以要解决这个问题,请更改以下代码行:

gameKey = "LMr4xql36nPZFvyX5n9";

gameKey = "-LMr4xql36nPZFvyX5n9";
//         ^

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

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

您的 logcat 中的结果将是:

testttggg

推荐阅读