【问题标题】:Android Firebase db datasnapshot pulling information from wrong db directoryAndroid Firebase db datasnapshot 从错误的 db 目录中提取信息
【发布时间】:2017-07-31 01:38:08
【问题描述】:

在我的 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);
    }


}

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

把这个 '.child()' 放进去是有问题的。

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

然而,当我完全删除“.child()”时,它让我可以看到整个数据库的视图。为什么要这样做?

监听代码:

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”的firebase监听器代码吗?
  • @Mani 你去吧
  • 我怀疑你对 firebase 的实例化 Firebase firebase = new Firebase("YOUR_PATH_TOFIREBASE_LOCATION");
  • 请编辑您的问题以包含重现问题所需的最小 JSON(可能只有一个孩子就足够了)。请以文字形式分享,而不是截图。您可以通过单击Firebase Database console 中的“导出 JSON”链接来获取此信息。
  • 你为什么要使用.child()?您可以更新DatabaseReference 以使用serverName/Lobby_Requests

标签: java android firebase firebase-realtime-database


【解决方案1】:

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

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

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

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

如您所见,只有一个按键。

【讨论】:

  • 这不是问题,实际上我手动推送了两次数据,希望能解决这个问题。即使只推送了一次数据,问题仍然存在。
  • 如果您的孩子在同一位置有一个或两个推入的 id,它将不起作用。你能像现在一样更新你的数据库结构吗?因为您的代码应该可以工作。不包含任何错误。
  • @dylan:虽然您的代码在只有一个推送 ID 时也可能无法运行,但如果拥有两次,它肯定无法运行。即使按照亚历克斯所说的做并不能完全解决你的问题,它至少会更接近MCVE。
猜你喜欢
  • 1970-01-01
  • 2013-07-12
  • 2016-07-19
  • 2012-03-03
  • 1970-01-01
  • 1970-01-01
  • 2016-07-09
  • 1970-01-01
  • 2015-12-29
相关资源
最近更新 更多