iOS Firebase-如何使用.childByAutoId()创建多节点位置更新

时间:2018-07-29 23:50:09

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

我使用iOS的UUID().uuidString将数据发送到单个子位置:

let userPostsRef = db?.child("users")?.child(\(uid))?.child("posts")?.child(theUUID) // uuid is basically the postId
userPostsRef.updateChildValues(userDict)

如果要将数据发送到多个节点,则必须以不同的方式构造节点子代:

let userPostsRef = "/users/\(uid)/posts/\(postId)"
let postRef = "/posts/\(uid)/\(postId)"

使用第一种方法,我可以获得对UUID的引用,并将uuid作为键/值对作为字典的一部分发送给任何节点。但是以第二种方式进行操作,因为没有引用开始,所以我无法访问.childByAutoId()

如何使用Firebase的.childByAutoId()创建多位置更新,并获得对它的引用而不是UUID().uuidString

let postId = UUID().uuidString // instead of uuidString I want to use .childByAutoId instead
let db = Database.database().reference()
let uid = Auth.auth().currentUser?.uid

@IBAction fileprivate func postButtonTapped(_ sender: UIButton) {

     var userDict = [String:Any]()
     // instead of sending self.postId I want to send .childByAutoId
     userDict.updateValue(self.postId, forKey: "postId")
     userDict.updateValue(commentTextField.text! forKey: "comment")             

     var postDict = [String:Any]()
     postDict.updateValue(commentTextField.text! forKey: "comment")

    let userPostsRef = "/users/\(uid)/posts/\(postId)"
    let postRef = "/posts/\(uid)/\(postId)"

    let multiNodeDict = [String:Any]()
    multiNodeDict.updateValue(userDict, forKey: userPostsRef)
    multiNodeDict.updateValue(postDict, forKey: postRef)

    db.updateChildValues(multiNodeDict)
}

1 个答案:

答案 0 :(得分:1)

childByAutoId()方法是纯客户端操作。它不会在数据库中创建子节点,而只是基于统计上保证唯一的密钥来生成唯一位置。从这个意义上讲,它与UUID非常相似,只是具有一些特殊的属性(例如基于时间戳),使它们作为数据库密钥更具吸引力。

这意味着您可以呼叫childByAutoId()并从中取出密钥作为postId

let postId = db.childByAutoId().key