【问题标题】:Access first datum in Firebase snapshot访问 Firebase 快照中的第一个数据
【发布时间】:2016-04-09 19:17:07
【问题描述】:

我试图仅在包含 10 个 URL 的 Firebase 快照中访问第一个数据的属性。然而,无论我尝试什么,我都会得到整个快照。我的代码如下所示:

myDataRef.limitToLast(10).on("child_added", function(snapshot) {
 var newImg = snapshot.child("url");
  console.log(newImg);
});

有没有办法在整个快照上指定 [0] 等,这样我就可以得到第一个数据?

【问题讨论】:

    标签: javascript firebase firebase-realtime-database


    【解决方案1】:

    让我更喜欢这一点,因为数据在 firebase 中的存储方式没有保证 - 第一项或索引第 0 项的概念取决于数据的存储方式和数据的检索方式。

    所以最好的办法是将所有值作为快照加载并按指定值(如日期或高度等)排序,然后从排序数组中选择第 0 个索引,或者加载数据子集并使用queryOrderedByChild 或 queryStartingAtValue

    这可能是问题的答案:它只检索指定节点中的第一个值:

    users
      user_0
        firstName: "Fred"
      user_1
        firstName: "Bill"
      user_2
        firstName: "Ted"
    

    和代码

    usersRef.observeSingleEventOfType(.ChildAdded, withBlock: { snapshot in
       if snapshot.value is NSNull {
          print("snapshot was NULL")
       } else {
         print(snapshot)
       }
    })
    

    结果

    Snap (user_0) {
        firstName = Fred;
    }
    

    【讨论】:

      【解决方案2】:

      在没有看到您的数据结构的情况下很难确定,但我认为您正在寻找:

      myDataRef.limitToLast(10).on("child_added", function(snapshot) {
        var newImg;
        snapshot.forEach(function(urlSnapshot) {
          if (!newImg) {
            newImg = urlSnapshot.val();
          }
        });
        console.log(newImg);
      });
      

      forEach() 循环遍历 snapshot 的所有子键,并使用每个子键的 DataSnapshot 调用内部回调。

      newImg = urlSnapshot.val(); 只会得到那个孩子的价值。您可能需要根据您的数据结构修改此位。

      【讨论】:

        【解决方案3】:

        您需要先将快照存储为数组,然后以 [0] 的形式访问它。

        我不在我的 mac 电脑上(我正在回答你关于 iOS 的问题,但我相信这个概念是相同的)所以这只是我的记忆,但如果语法正确,它就可以工作:

        var newImgArray = snapshot.children.objects as? [FS快照] var newImg = newImgArray[0].value

        【讨论】:

        • 害怕我得到“未定义”。我试过var newImgArry = snapshot.val();console.log(newImgArry[0].value);
        • 我认为如果您查询 10 个项目而不是在一个数组中返回所有 10 个项目,则 .childAdded 实际上被调用了 10 次。如果是这种情况,只需在 Firebase 调用之外创建一个数组,并将每个快照附加到您的数组中。好像您不在 iOS 中工作,所以我无法帮助使用语法,但想法是在外部创建一个数组,然后使用 myArray.append(snapshot)。然后在您的 Firebase 通话之后,您可以访问 myArray[0]
        猜你喜欢
        • 2017-01-30
        • 2017-07-27
        • 2020-06-21
        • 1970-01-01
        • 2017-01-30
        • 2020-06-11
        • 1970-01-01
        • 2017-03-26
        • 1970-01-01
        相关资源
        最近更新 更多