使用ChildAdded从Swift 4的Firebase数据库中获取第一个密钥

时间:2019-02-19 11:47:02

标签: ios swift firebase firebase-realtime-database swift4

我正试图从我的Firebase数据库中获取第一个密钥,但是由于某种原因,什么都没有打印出来。如何使用.childAdded

从Firebase数据库中获取第一个密钥
let userMessagesRef = Database.database().reference().child("user-message").child(uid).child(userId)
    userMessagesRef.observe(.childAdded, with: { (snapshot) in

        guard let first = snapshot.children.allObjects.first as? DataSnapshot else { return }
        print(first)

Database node

2 个答案:

答案 0 :(得分:0)

  

从数据库中检索项目列表时通常使用child_added事件。与返回位置的全部内容的值不同, child_added会为每个现有子级触发一次,然后每次将新的子级添加到指定路径时都会触发一次。事件回调传递给包含新子数据的快照。为了排序,还传递了第二个参数,其中包含前一个子项的键。

发件人:Read and Write Data on iOS

根据您的要求,可以在.valuechildAdded中实现。

var child_array = [String:String]
let userMessagesRef = Database.database().reference().child("user-message").child(uid).child(userId)
    userMessagesRef.observe(.childAdded, with: { (snapshot) in
        let value = snapshot.value as? String ?? "Empty String"
        let key = snapshot.key 
        child_array[key] = value;


        }) { (error) in
    print(error.localizedDescription)
}

然后:

if let first = child_array.first?.key {
    print(first)  // First Key
}
  

大提示:child_added会随机收集此数据,永远不要使用它来对数据进行排序

答案 1 :(得分:0)

如果您确实在问如何仅获得节点的第一个孩子,这将非常容易。这是仅获取/ users节点的第一个孩子的方法

func getFirstChild() {
    let usersRef = self.ref.child("users")
    usersRef.observeSingleEvent(of: .childAdded, with: { snapshot in
        print(snapshot)
    })
}

print(snapshot.key)

如果您只想要钥匙。

或者,如果您想使用查询执行相同的操作

func getFirstChildAgain() {
    let usersRef = self.ref.child("users")
    let query = usersRef.queryOrderedByKey().queryLimited(toFirst: 1)
    query.observeSingleEvent(of: .value, with: { snapshot in
        print(snapshot)
    })
}