2016-01-05 22 views
2

我试图访问仅包含10个URL的Firebase快照中的第一个数据的属性。不管我尝试什么,但是,我得到了整个快照。我的代码如下所示:访问Firebase快照中的第一个数据

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

有没有一种方法来指定[0]或整个快照,这样我就得到了第一个数据之类的?

回答

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();只会得到那个孩子的价值。您可能必须根据您的数据结构修改此位。

0

您需要先将快照存储为数组,然后将其作为[0]进行访问。

我不是在我的Mac电脑(我回答你的问题,因为iOS,但我相信这个概念是相同的),所以这只是从我的记忆,但它的作品,如果语法是正确的:

var newImgArray = snapshot.children.objects as? [FSSnapshot] VAR newImg = newImgArray [0] .value的

+0

害怕我得到“未定义”。我尝试'var newImgArry = snapshot.val();' 'console.log(newImgArry [0] .value);' – eabates

+0

我认为.childAdded实际上被称为10次,如果您查询10个项目而不是全部返回一个数组中有10个项目。 如果是这种情况,只需在Firebase调用之外创建一个数组,然后将每个快照添加到您的数组中。好像你不在iOS上工作,所以我无法提供语法帮助,但想法是在外部创建一个数组,然后使用myArray.append(快照)。然后在Firebase调用之后,您可以访问myArray [0] –

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; 
}