random1234
random1234

Reputation: 817

Swift Firebase read children of a child

So I am trying to read the children of the autoID children beneath "Recipes" below is a picture of my Firebase database and beneath that is the method that is supposed to retrieve the value of "Description" and "Name" and insert them into variables.

The error that I am currently getting when running the app is this:

Could not cast value of type '__NSCFString' (0x10ad2afb8) to 'NSDictionary' (0x10ad2bfa8).

My Firebase database

    ref = Database.database().reference()

    databaseHandle = ref?.child("Recipes").observe(.childAdded) { (snapshot) in

        for snap in snapshot.children
        {
            let recipeSnap = snap as! DataSnapshot
            let recipeID = recipeSnap.key
            let dict = recipeSnap.value as! [String:AnyObject]
            let recipeName = dict["Name"] as! String
            let recipeDescription = dict["Description"] as! String
            print("key = \(recipeID) and name = \(recipeName) and description = \(recipeDescription)")
        }
  }

The print statement is just there for testing.

Upvotes: 0

Views: 2937

Answers (1)

j___.___j
j___.___j

Reputation: 326

Try the following and let me know if it works now:

// SEARCHES FOR SHARING CODE IN DATABASE (ONLINE)
let parentRef = Database.database().reference().child("Recipes")

parentRef.observeSingleEvent(of: .value, with: { snapshot in

    // SHOWING WHATEVER WAS RECEIVED FROM THE SERVER JUST AS A CONFIRMATION. FEEL FREE TO DELETE THIS LINE.
    print(snapshot)

    // PROCESSES VALUES RECEIVED FROM SERVER
    if ( snapshot.value is NSNull ) {

       // DATA WAS NOT FOUND
       print("– – – Data was not found – – –")

    } else {

        // DATA WAS FOUND
        for user_child in (snapshot.children) {

            let user_snap = user_child as! DataSnapshot
            let dict = user_snap.value as! [String: String?]

            // DEFINE VARIABLES FOR LABELS
            let recipeName = dict["Name"] as? String
            let recipeDescription = dict["Description"] as? String
            print("– – – Data for the recipe \(recipeName) with the description \(recipeDescription) was found successfully! – – –")
        }
    }
}

If you only want to retrieve the name and description for one specific recipe, you should change the third line to

parentRef.queryEqual(toValue:DefineWhatToSearchForHere).observeSingleEvent(of: .value, with: { snapshot in

If you constantly want to update to reflect changes, you can either call this function every x seconds using a timer and adding it to override func viewDidLoad() such as

time = Timer.scheduledTimer(timeInterval: 10, target: self, selector: #selector(ViewController.updateFBData), userInfo: nil, repeats: true)

after creating a function called func updateFBData() in which you do whatever you want to do to get new data (see above) and calling it in a defined timeInterval

or you can do what Attila Hegedüs in this excellent tutorial.

Upvotes: 5

Related Questions