raddaoui
raddaoui

Reputation: 105

Update Value Firebase Swift 3

I'm having trouble updating a value in my Firebase database with the key status. I just can't figure out how to access the child(id) in which it is an autoID. Should I have an attribute in my Swift 3 Entity? Or is there a child(autoID) or something similar? I'm new in Firebase and Swift 3. Can any one help? This is my code:

 self.ref?.child("requests").queryOrdered(byChild: "Sender").queryEqual(toValue: self.items[indexPath.row].Sender).setValue("2", forKey: "status")) 

click here to see an image showing my database

Upvotes: 1

Views: 1347

Answers (3)

Ashvini
Ashvini

Reputation: 352

You can update status value as below:

self.ref?.child("requests").queryOrdered(byChild: "Sender").queryEqual(toValue: self.items[indexPath.row].Sender).observe(.value, with: { (snapshot) in

let value = snapshot.value as? NSDictionary
if value != nil {              
    self.ref.child("requests/(self.items[indexPath.row].Sender)").updateChildValues(["status":"2"])
}
})

Upvotes: 0

Andrian Rahardja
Andrian Rahardja

Reputation: 344

Swift 3 && Firebase 3

Hope this code will be help you...

    // create the reference you want to observe
    let myRequestRef = FIRDatabase.database().reference().child("requests").queryOrdered(byChild: "Sender").queryEqual(toValue: self.items[indexPath.row].Sender)

    // check the sender value
    myRequestRef.observeSingleEvent(of: .value, with: { (snapshot) in

        //get the sender key
        let senderKey = snapshot.key as String

        // create status ref for new status value
        let statusRef = FIRDatabase.database().reference().child("requests").child(senderKey)

        // create new dict for status value
        let newValue = ["Status": 2] as [String: Any]

        statusRef.updateChildValues(newValue, withCompletionBlock: { (error, _) in
            if error != nil {
                print(error?.localizedDescription ?? "Failed to set status value")
            }
            print("Successfully set status value")
            // Update your UI
            DispatchQueue.main.async {
                // Do anything with your UI
            }
        })
    }) { (error) in
        print("Failed to get snapshot", error)
    }

Upvotes: 1

nviens
nviens

Reputation: 447

Try moving your code inside .observe. This will allow you to get the status and check that it's accessing the right child. By using the child path below, it will override the status value but not the rest of the values inside the child.

self.ref?.child("requests").queryOrdered(byChild: "Sender").queryEqual(toValue: self.items[indexPath.row].Sender).observe(.value, with: { (snapshot) in

    let value = snapshot.value as? NSDictionary

    if value != nil {
        print(value)
        print(value["status"])
        // If status is what you want, and prints out the correct status and 
        // correct child item

        // Update the status
        self.ref.child("requests/\(self.items[indexPath.row].Sender)/status").setValue("2")
    }
})

I haven't tested the code above, but you should be able to make minor tweaks to get it to work in your code and on your firebase database.

Upvotes: 0

Related Questions