开发者问题收集

从 firebase 获取正确路径时出错

2018-12-04
262

我是 React Native 的新手,我正在努力从 Firebase 获取列表。但我无法为对象提供路径。我不知道如何为图中所示的事件 ID 提供路径。 在此处输入图片描述

以下是我想要提供正确路径的代码。任何帮助都将不胜感激。

firebase.database().ref('/events').child('/friends').once('value').then((snapshot) =>{
    let data = snapshot.val();
    let items = object.values(data);
    allUserList.push(items);
    this.setState({allFriendList: allFriendList});

}

我有多个键,请查看图片 在此处输入图片描述

这是我想要显示好友列表的 flatlist 的代码

<FlatList style={{}} keyboardShouldPersistTaps={'always'}
data={this.state.allFriendList}
ItemSeparatorComponent={this.renderSeparator}
renderItem={({ item }) => {
        return (
        <TouchableOpacity onPress={() => this.goToNextScreen(item)}>
        <View style={{
                flexDirection: 'row', paddingBottom: 5, paddingTop: 5,
                justifyContent: 'space-between', alignItems: 'center'
            }}>
    }
}
3个回答

您只需在 ref 中输入完整路径即可:

firebase.database().ref('/events/friends/whatever-key')
    .once('value').then((snapshot) =>{
        /// Whatever code
    });
Jason Byrne
2018-12-04

如果您想要显示某个事件的好友列表,并且您知道该事件的密钥,您可以执行以下操作:

let eventKey = '-LRuFQAsleScaEK2MqXu';
let eventRef = firebase.database().ref('events').child(eventKey);
eventRef.child('friends').once('value').then((snapshot) =>{
  let allFriendList = [];
  snapshot.forEach((friendSnapshot) => {
    let data = friendSnapshot.val();
    allUserList.push(data);
  });
  this.setState({allFriendList: allFriendList});
});

部分更改:

  • 此代码仅监听特定路径 /events/-LRuFQAsleScaEK2MqXu/friends 。事实上,它可以使用该路径进行监听,即 firebase.database().ref('/events/-LRuFQAsleScaEK2MqXu/friends').once('value'...`
  • 我们从中获取的 snapshot 包含多个朋友,因此我们使用 snapshot.forEach() 循环遍历它们。
  • 将所有朋友添加到列表中后,我们调用 setState 来通知 React。

在评论中,您表示希望合并所有朋友列表,您可以使用以下方法执行此操作:

let eventsRef = firebase.database().ref('events');
eventRef.once('value').then((snapshot) =>{
  let allFriendList = [];
  snapshot.forEach((eventSnapshot) => {
    eventSnapshot.child('friends').forEach((friendSnapshot) => {
      let data = friendSnapshot.val();
      allUserList.push(data);
    });
  });
  this.setState({allFriendList: allFriendList});
});

但我 强烈 建议更改/增强此用例的数据模型。此代码可能有效,但读取的数据远远超过所需。如果同一个朋友存在于更多事件。如果您想要一个全局好友列表,我会将其精确地存储在数据库中:用户列表,可能还有他们好友的事件的事件 ID。

Frank van Puffelen
2018-12-04

个人偏好,使用 [key] 方法非常适合自定义键名。

例如,如果您知道键, data.[key].name 将产生您的结果。

如果您不知道该键 ( LRjSl... ),您可以迭代 friends 对象:

for (var key in data) {
    data[key].name //will be Shabnam
}
mewc
2018-12-04