Luke Zammit
Luke Zammit

Reputation: 185

Firebase swift not retrieving all child values

I have a piece of code inside my Swift built iOS app, to retrieve all the nodes from a Firebase Realtime database. When I execute the code below I've noticed that it does not return all the child nodes.

When I query the particular nodes which are not being returned individually, at first the code returns 'nil' and then on a second attempt retrieves the nodes. (without doing any code changes in the process). Following this process, the node starts to show up in the results with the retrieve all nodes function.

Example 1: First returns nil, then on a second attempt returns the node. Which I can see from the console and definitely exists on the database.

ref?.child("transactions").child(email).child("14526452327").observeSingleEvent(of: .value, with: { (snapshot) in
                // Get user value
                let value = snapshot.value as? NSDictionary
                        print(value)
                        print("!!****************!!")
                // ...
            }) { (error) in
                print(error.localizedDescription)
            }

The following is being used to retrieve all child values; at first this doesn't get all the nodes, however after running the code from Example 1 (twice) it starts to return the node in question.

ref?.child("transactions").child(email).observeSingleEvent(of: .value, with: { (snapshot) in

        let childrenCount = snapshot.childrenCount
        var counter : Int = 0

        for trans in snapshot.children.allObjects as! [DataSnapshot]
        {
            counter = counter + 1

            self.ref?.child("transactions").child(email).child(trans.key).observeSingleEvent(of: .value, with: { (snapshot2) in

Here is a screenshot of the Firebase DB structure;

I've also checked my Firebase query and data limits and I am nowhere near the threshold for the free account. Any help is greatly appreciated.

Upvotes: 4

Views: 1375

Answers (1)

Stijnk008
Stijnk008

Reputation: 232

Try this:

func getData() {
    // Making a reference
    let transactionRef = Database.database().reference(withPath: "transactions")
    transactionRef.observeSingleEvent(of: .value, with: { (snapshot) in

        // Printing the child count
        print("There are \(snapshot.childrenCount) children found")    

        // Checking if the reference has some values
        if snapshot.childrenCount > 0 {

            // Go through every child
            for data in snapshot.children.allObjects as! [DataSnapshot] {
                if let data = data.value as? [String: Any] {

                    // Retrieve the data per child


                    // Example
                    let name = data["name"] as? String
                    let age = data["age"] as? Int

                    // Print the values for each child or do whatever you want
                    print("Name: \(name)\nAge: \(age)")
                }
            }
        }
    })
}

Upvotes: 3

Related Questions