Bob Bob - 2 months ago 8
Swift Question

How to properly structure Firebase database to allow easy reading and removal

I am creating a recipe finding app and basically I have a "favorites" where if the user favorites a recipe, they will be able to easily access it in the favorites tab of the app. Basically this is my structure right now:

app:
users:
2ReAGRZlYiV5F2piwMakz59XDzl1(uid):
favorites:
-KRUe6mMhaQOX62zgXvg(childByAutoId):
ID: 172171 (recipe id)
UTJ0rVst9zMSuQhWkikTCu8558C2(uid):
favorites:
-KRUzMxTvv-uNvX9J9_-(childByAutoId):
ID: 578141 (recipe id)


Basically whenever they go to the favorites tab, I need the list of all the recipe ids so that I can make an API call to retrieve the recipe information. I am basically looping through the dictionary. I also want to be able to allow the user to unfavorite the recipe, so removing it from the database. How will I be able to remove it if I am using:

USERS_REF.child(uid).child("favorites").childByAutoId().setValue(["ID": recipeID])


to add a recipe?

Is there a better structure that I can use to read recipe ids and remove them easily?

Answer

You might wanna consider making favourites as a NSDictionary:-

 app:
  users:
   2ReAGRZlYiV5F2piwMakz59XDzl1: //(uid)
    favorites:
      {172171 : true,
        4123123 : true,..} 

For Appending in the favourites:-

 USERS_REF.child(uid).child("favorites").updateChildValues([recipeID: "true"])

Or

  let prntRef = USERS_REF.child(uid).child("favorites")
  prntRef.observeSingleEventOfType(.Value, withBlock: {(snap) in

    if let favDict = snap.value as? NSMutableDictionary{
             favDict.setObject("true",forKey : recipeID)
             prntRef.setValue(favDict) 
       }else{

       prntRef.setValue(["true":recipeID])
          }
   })

For Updating from the favourites:-

USERS_REF.child(uid).child("favorites").updateChildValues([recipeID: "false"])  //User doesn't like's the recipe anymore

For Deleting from the favourites:-

USERS_REF.child(uid).child("favorites").child(recipeID).removeValue()  //User want to remove this item from its history

Whilst Retrieving

let prntRef = USERS_REF.child(uid).child("favorites")
  prntRef.observeSingleEventOfType(.Value, withBlock: {(snap) in

   if let favDict = snap.value as? [String:AnyObject]{

        for each in favDict{

          let eachRecipeId = each.0 //recipeID
          let isMyFav = each1 // Bool
         }

      }else{
        print("No favourites")
       }
  })
Comments