java - Android Firebase db datasnapshot 从错误的数据库目录中提取信息

标签 java android firebase firebase-realtime-database

在我的 Android 应用中,我使用 Google Firebase 在数据库中存储信息。

我需要迭代信息,并且正在使用下面的for循环

public void showDataLobReq(DataSnapshot dataSnapshot){

    for(DataSnapshot ds : dataSnapshot.child("Lobby_Requests").getChildren()){
        System.out.println("asdfasdfasdfasdfasdf"+ds.getValue());
        game = ds.child(userID).child("game").getValue(String.class);
        console = ds.child(userID).child("console").getValue(String.class);
        mic = ds.child(userID).child("mic").getValue(String.class);
        players = ds.child(userID).child("players").getValue(String.class);
    }


}

您可能会注意到我将“.child("Lobby_Requests")”放在 dataSnapshot 之后。这是因为 dataSnapshot 拍摄了整个数据库的快照,因此我必须进入子目录“Lobby_Requests”,因为那是我需要迭代的信息所在的位置。

将这个“.child()”放入是有问题的。

我将 dataSnapshot 在 for 循环的第一行中包含的内容打印到控制台,并使用 .child("Lobby_Requests") 从实际数据库中的目录“Lobbys”中提取信息,这是一个完全不同的目录。

然而,当我完全删除“.child()”时,它会给我一个整个数据库的 View ,就像它应该的那样。为什么要这样做?

监听器代码:

nRef = mFirebaseDatabase.getReference();
    nRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()){
                showDataLobReq(dataSnapshot);
            } else {

            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

这是 JSON:

{


"Games" : {
    "Forza 6" : {
      "Consoles" : {
        "PC" : true,
        "Xbox 1" : true,
        "Xbox 360" : true
      },
      "FilePathName" : "forza6",
      "Genres" : {
        "Racing" : true
      },
      "Live Lobbies" : 0,
      "Name" : "Forza 6"
    },
    "Minecraft" : {
      "Consoles" : {
        "PC" : true,
        "Xbox 1" : true,
        "Xbox 360" : true
      },
      "FilePathName" : "minecraft",
      "Genres" : {
        "Adventure" : true,
        "Creation" : true,
        "Open World" : true
      },
      "Live Lobbies" : 0,
      "Name" : "Minecraft"
    }
  },
  "Lobbies" : {
    "Cd6lVd2XMUYoLH6b0xoHsrfXMud2" : {
      "Messages" : {
        "-Kq6-1HsMvElEXZZyCIk" : {
          "messageText" : "hey",
          "messageTime" : 1501208519771,
          "messageUser" : ""
        }
      },
      "console" : "Origin",
      "game" : "Minecraft",
      "leader" : "Cd6lVd2XMUYoLH6b0xoHsrfXMud2",
      "mic" : "Mic",
      "note" : "2345",
      "players" : "4"
    },
    "KUWH5f1TmYfO1O1wgCJLli3XZFi2" : {
      "console" : "Steam",
      "game" : "Forza 6",
      "mic" : "No Mic",
      "note" : "Hey Join Here!",
      "players" : "2"
    },
    "hpWkq0D8clPReUetOq9Xtmc4V582" : {
      "Messages" : {
        "-Kq5a0kX305lFCRTSM_G" : {
          "messageText" : "hello",
          "messageTime" : 1501201701014,
          "messageUser" : ""
        },
        "-Kq5asufOWQwtmyNJrQ7" : {
          "messageText" : "hey",
          "messageTime" : 1501201926941,
          "messageUser" : ""
        }
      },
      "console" : "Xbox One",
      "game" : "Minecraft",
      "leader" : "hpWkq0D8clPReUetOq9Xtmc4V582",
      "mic" : "Mic",
      "note" : "kjhg",
      "players" : "4"
    }
  },
  "Lobby_Requests" : {
    "Cd6lVd2XMUYoLH6b0xoHsrfXMud2" : {
      "Cd6lVd2XMUYoLH6b0xoHsrfXMud2" : {
        "console" : "Xbox One",
        "game" : "Forza 6",
        "mic" : "Mic",
        "players" : "5"
      }
    },
    "KUWH5f1TmYfO1O1wgCJLli3XZFi2" : {
      "KUWH5f1TmYfO1O1wgCJLli3XZFi2" : {
        "console" : "Steam",
        "game" : "Forza 6",
        "mic" : "No Mic",
        "players" : "2"
      }
    },
    "hpWkq0D8clPReUetOq9Xtmc4V582" : {
      "hpWkq0D8clPReUetOq9Xtmc4V582" : {
        "console" : "Xbox One",
        "game" : "Minecraft",
        "mic" : "Mic",
        "players" : "4"
      },
      "players" : "4"
    }
  },
  "users" : {
    "8cHrNCybwjO3PIUKxyOLiAqxJBv1" : {
      "gamertag" : "thedylan",
      "uname" : "thedood"
    },
    "Cd6lVd2XMUYoLH6b0xoHsrfXMud2" : {
      "gamertag" : "dmdylan",
      "uname" : "ninja goat"
    },
    "KUWH5f1TmYfO1O1wgCJLli3XZFi2" : {
      "gamertag" : "skaner",
      "uname" : "asdf"
    },
    "YvYEIiCBUSYKTviVyWpLHdyDIFw1" : {
      "gamertag" : "joejoe",
      "uname" : "Jifflingly"
    },
    "ZmX9yIZ6MNguQa1S3MaYNcxfK2b2" : {
      "gamertag" : "dmkaner",
      "uname" : "dmkaner"
    },
    "hpWkq0D8clPReUetOq9Xtmc4V582" : {
      "gamertag" : "dmkaner",
      "uname" : "dmkaner"
    },
    "t21ncnuRmeV4F7RknETBisMrxS42" : {
      "gamertag" : "asdf",
      "uname" : "asdf"
    }
  }
}

最佳答案

代码中的问题是您推送数据两次,但没有必要这样做。

  "Lobby_Requests" : {
      "Cd6lVd2XMUYoLH6b0xoHsrfXMud2" : {
          "Cd6lVd2XMUYoLH6b0xoHsrfXMud2" : { //This is wrong

如果您通过仅推送一次数据来更改向 Firebase 数据库添加数据的方式,那么您的代码将正常工作。您的数据库应如下所示:

"Lobby_Requests" : {
  "Cd6lVd2XMUYoLH6b0xoHsrfXMud2" : {
    "console" : "Xbox One",
    "game" : "Forza 6",
    "mic" : "Mic",
    "players" : "5"
  },

正如您可能看到的,只有一个按下的键。

关于java - Android Firebase db datasnapshot 从错误的数据库目录中提取信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45406391/

相关文章:

android - 给定用户的 FirebaseUser.getUid() 是常量吗?

firebase - 如何创建 Firebase 身份验证声明?

java - 缺少重要参数/依赖项时抛出什么异常?

java - 如何使用属性文件通过 struts2 更改 jquerytheme

java - 如何检查将字符串值与数组中的每个元素进行比较?

java - 是什么导致通话录音机上的录音文件大小保存为 0 KB?

android - FragmentStatePagerAdapter/更新操作栏标题

android - 如何在获取 Firebase 数据时在 Flutter 中显示和隐藏对话框

java - 单独的字符串输入android

android - 如何在通话期间通过代码启用 Android 扬声器?