Firebase:如何将数据放入已使用childbyAutoID创建的子项中

时间:2017-09-15 22:47:53

标签: swift xcode firebase firebase-realtime-database

我的应用中的人有时需要更新某些内容的状态。现在你可以选择两件事:所谓的“Rollerbank”仍在那里或者“Rollerbank”被删除。用户可以创建数据引用。将由childbyAutoID创建的id。现在我的问题是如何找到合适的孩子并用一个值更新一些孩子。我的帖子:

class Post {
    let ref: DatabaseReference!
    var TypeControle: String = ""
    var Stad: String = ""
    var Tijd: String = ""
    var TijdControle: String = ""
    var TijdControleniet: String = ""
    var Latitude: String = ""
    var Longitude: String = ""
    var Extrainformatie: String = ""
    var Staater: String = ""
    var Staaternietmeer: String = ""

    init(TypeControle: String) {
        self.TypeControle = TypeControle
        ref = Database.database().reference().child("Rollerbanken").childByAutoId()
    }
    init(Stad: String){
        self.Stad = Stad
        ref = Database.database().reference().child("Rollerbanken").childByAutoId()
    }
    init(Tijd: String) {
        self.Tijd = Tijd
        ref = Database.database().reference().child("Rollerbanken").childByAutoId()
    }
    init(Latitude: String) {
        self.Latitude = Latitude
        ref = Database.database().reference().child("Rollerbanken").childByAutoId()
    }
    init(Longitude: String) {
        self.Longitude = Longitude
        ref = Database.database().reference().child("Rollerbanken").childByAutoId()
    }
    init(Extrainformatie: String) {
        self.Extrainformatie = Extrainformatie
        ref = Database.database().reference().child("Rollerbanken").childByAutoId()
    }
    init(Staater: String) {
        self.Staater = Staater
        ref = Database.database().reference().child("Rollerbanken").child("Controletest").childByAutoId()
    }
    init(Staaternietmeer: String) {
        self.Staaternietmeer = Staaternietmeer
        ref = Database.database().reference().child("Rollerbanken").childByAutoId()
    }
    init(TijdControle: String) {
        self.TijdControle = TijdControle
        ref = Database.database().reference().child("Rollerbanken").childByAutoId()
    }
    init(TijdControleniet: String) {
        self.TijdControleniet = TijdControleniet
        ref = Database.database().reference().child("Rollerbanken").childByAutoId()
    }

    init() {
        ref = Database.database().reference().child("Rollerbanken").childByAutoId()
    }

    init(snapshot: DataSnapshot)
    {
        ref = snapshot.ref
        if let value = snapshot.value as? [String : Any] {
            TypeControle = value["TypeControle"] as! String
            Stad = value["Stad"] as! String
            Tijd = value["Tijd"] as! String
            Latitude = value["Latitude"] as! String
            Longitude = value["Longitude"] as! String
            Extrainformatie = value["Extrainformatie"] as! String
            Staater = value["Staater"] as! String
            Staaternietmeer = value["Staaternietmeer"] as! String
            TijdControle = value["TijdControle"] as! String
            TijdControleniet = value["TijdControleniet"] as! String

        }
    }

    func save() {
        ref.setValue(toDictionary())
    }

    func toDictionary() -> [String : Any]
    {
        return [
            "TypeControle" : TypeControle,
            "Stad" : Stad,
            "Tijd" : Tijd,
            "Latitude" : Latitude,
            "Longitude" : Longitude,
            "Extrainformatie" : Extrainformatie,
            "Staater" : Staater,
            "Staaternietmeer" : Staaternietmeer,
            "TijdControle" : TijdControle,
            "TijdControleniet" : TijdControleniet

        ]
    }
}

TableViewCell的数据:

class ControleTableViewCell: UITableViewCell {
    @IBOutlet weak var storyControle: UILabel!
    @IBOutlet weak var storyTijd: UILabel!

    var post: Post! {
        didSet {
            storyControle.text = "\(post.Staaternietmeer)"
            storyTijd.text = "\(post.TijdControleniet)"
            storyControle.text = "\(post.Staater)"
            storyTijd.text = "\(post.TijdControle)"

        }
    }

我的更新按钮如何显示:

 @IBAction func Update(_ sender: Any) {
        let alertController1 = UIAlertController(title: "Update melden" , message: "De rollerbank", preferredStyle: .alert)

        // Create the actions
        let RollerbankAction1 = UIAlertAction(title: "Staat er nog steeds", style: UIAlertActionStyle.default) {
            UIAlertAction in
            NSLog("Ja Pressed")

            self.newStory.Staater = self.Staater
            self.newStory.TijdControle = self.TijdControle
            self.newStory.save()
        }


        let cancelAction1 = UIAlertAction(title: "Staat er niet meer", style: UIAlertActionStyle.cancel) {
            UIAlertAction in
            NSLog("Cancel Pressed")

            let date = Date()
            let calendar = Calendar.current
            let hour = calendar.component(.hour, from: date)
            let minutes = calendar.component(.minute, from: date)
            let Tijd = "\(hour) : \(minutes)"

            self.newStory.Staaternietmeer = self.Staaternietmeer
            self.newStory.TijdControleniet = Tijd
            self.newStory.save()


    }

        alertController1.addAction(RollerbankAction1)
        alertController1.addAction(cancelAction1)
        self.present(alertController1, animated: true, completion: nil)
    }

这是我使用的结构。如果我运行所有这些代码,新数据将进入另一个childbyAutoID,这不是我想要的。它只需要在名为“Staaternietmeer”和“TijdControleniet”的清除空间中更新/设置值。任何人都可以帮助我吗? Structure

1 个答案:

答案 0 :(得分:1)

然后,您需要将推送ID存储在某处,以便以后可以重复使用。

要生成您将使用的唯一推送ID:

Database.database().reference().childByAutoId()

将它存放在某个地方:

let postKey = Database.database().reference().childByAutoId().key

然后,假设您需要一种方法来共享帖子,并希望将此帖子添加到多个节点,这可能是它的样子:

func sharePost(_ postContent: String, completion: @escaping (Bool) -> ()) {

    guard let currentUserId = Auth.auth().currentUser?.uid else {
        completion(false)
        return
    }

    let postKey = Database.database().reference().childByAutoId().key

    let postData: [String: Any] = [ "content": "blabla",
                                    "author": currentUserId ]

    let childUpdates: [String: Any] = ["users/\(currentUserId)/posts/\(postKey)": true,
                                       "posts/\(postKey)": postData ]

    Database.database().reference().updateChildValues(childUpdates, withCompletionBlock: { (error, ref) in

        guard error == nil else {
            completion(false)
            return
        }

        completion(true)
    })

}

现在要稍后访问唯一的推送ID,您可以使用:

Database.database().reference().observe(.childAdded, with: { (snapshot) in

    // Here you get the Push ID back :

    let postKey = snapshot.key

    // And others things that you need :

    guard let author = snapshot.childSnapshot(forPath: "author").value as? String else { return }
    guard let content = snapshot.childSnapshot(forPath: "content").value as? String else { return }

    // Here you store your object (Post for example) in an array, and as you can see you initialize your object using the data you got from the snapshot, including the Push ID (`postKey`) :

    posts.append(Post(id: postKey, content: content, author: author))

})