【问题标题】:How to iterate over a Datasnapshot without specifying parent folder/ref如何在不指定父文件夹/引用的情况下迭代 Datasnapshot
【发布时间】:2017-02-19 11:40:40
【问题描述】:

我想遍历具有以下结构的数据快照;

 {
"data" : {
"images" : {
  "fw88v6xu6wybamg9zzt6" : {
    "0550e909-3b30-4f83-9725-02fbe45b74ce" : 3,
    "address" : "http://xxxxxxxxxxxxxxx.jpg",
    "author" : "username1",
    "author_id" : "0550e909-3b30-4f83-9725-02fbe45b74ce",
    "location" : "0",
    "rating" : 3
  },
  "osgm6v7kfcjwogo5uv21" : {
    "0550e909-3b30-4f83-9725-02fbe45b74ce" : 4,
    "address" : "xxxxxxxxxxxxxxxx.jpg",
    "author" : "username1",
    "author_id" : "0550e909-3b30-4f83-9725-02fbe45b74ce",
    "location" : "0",
    "rating" : 4
  },
  "prhpcbrrru7z8x6xtolq" : {
    "0550e909-3b30-4f83-9725-02fbe45b74ce" : 6,
    "address" : "xxxxxxxxxxxxxx.jpg",
    "author" : "username2",
    "author_id" : "0550e909-3b30-4f83-9725-02fbe45b74ce",
    "location" : 0,
    "rating" : 6
  }
},
"locations" : {
  "location1" : {
    "author" : "0550e909-3b30-4f83-9725-02fbe45b74ce",
    "latitude" : 11.42222573,
    "longitude" : 58.4348011
  },
  "location2" : {
    "author" : "0550e909-3b30-4f83-9725-02fbe45b74ce",
    "latitude" : 11.42222573,
    "longitude" : 38.4333311
  }
 }
}

具体来说,我正在做的是获取数据/图像子项的快照,因此它将是具有自动生成引用的三个条目,例如 fw88v6xu6wybamg9zzt6 因此我无法访问特定条目来检索作者的地址,所以我让我的应用程序获取

    Iterable<DataSnapshot> imagesDir = snapshot.getChildren();

我不确定如何在不知道父 ref 的情况下查看此快照的每个条目并检索条目信息。 (fw88v6xu6wybamg9zzt6)?

好吧,我得到了post

感谢 Chris,让我在正确的路径上搜索它,但仍然无法构建正确的语法来达到我想要做的事情。

目前我的方法如下;

  public void onDataChange(DataSnapshot snapshot) {
            for (DataSnapshot child: snapshot.getChildren()) {
                Log.i("MyTag", child.getValue().toString());
                imagesDir.add(String.valueOf(child.getValue()));
            }
            Log.i("MyTag", imagesDir.toString());

从第一个日志中,我得到每个节点的所有值的字符串,在第二个日志中,我构造了一个包含所有节点的数组。

我想要做的是将特定节点(例如地址值)添加到我在 onDataChange 方法之外声明的 ArrayList 中,每次它迭代一个子节点时。所以在 for 循环结束时,在这种情况下,我将在 arraylist 中拥有三个地址(只有值)。

为了做到这一点,构建 for 循环的正确方法是什么?

好吧,我得到并给我正确结果的最终代码如下;

              public void onDataChange(DataSnapshot snapshot) {
            for (DataSnapshot child: snapshot.getChildren()) {
                Log.i("MyTag", child.getValue().toString());
                imagesDir.add(child.child("author").getValue(String.class));
            }
            Log.i("MyTag_imagesDirFinal", imagesDir.toString());

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:

    假设您将ValueEventListener 附加到images

    public void onDataChange(DataSnapshot imagesSnapshot) {
        for (DataSnapshot imageSnapshot: imagesSnapshot.getChildren()) {
            imagesDir.add(imageSnapshot.child("address").getValue(String.class));
        }
        Log.i("MyTag", imagesDir.toString());
    }
    

    【讨论】:

    • 感谢您的帮助,我现在对它有了更好的理解,尽管我必须说我遇到了一个小问题,像您在 for 循环中所做的那样将 Datasnapshot 声明为 imagesSnapshot,这更少比我最初使用“child”所做的更令人困惑,但理解它是如何工作的。
    【解决方案2】:

    如果您检索“图像”的快照,您可以访问 getChildren() 方法来遍历每个图像,即使不知道键。

    如果需要,可以通过调用子级的 getKey() 来访问它们的键。

    getChildren() 方法的参考可以在参考文档中找到:

    https://firebase.google.com/docs/reference/android/com/google/firebase/database/DataSnapshot.html#public-methods

    【讨论】:

    • 谢谢@Chris_Conway,你让我了解了它的工作方式,并且在一些搜索的帮助下,我找到了与我类似的帖子,但仍然无法构建正确的语法实现我想要做的事情,正如你在我更新的帖子中看到的那样
    • 不客气。你试过for (DataSnapshot child : parent.getChildren()) { ... } 吗? child.key 应该为这些子对象之一返回您的 fw88... 密钥。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 2020-03-22
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    相关资源
    最近更新 更多