简体   繁体   中英

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?

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"]) 

    Mind that , if your recipeID is unique, ie doesnt already exist at favourites node Only then it will append the value, if the recipieID already exists it will just update its value (Dont prefer this for appending, look up the next option)

    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 in 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 = each.1 // Bool } } else { print("No favourites") } }) 
  • Whilst Retrieving For a known key-value pair

      let prntRef = USERS_REFFIR.child("users").queryOrderedByChild("favorites/\\(recipeID)").queryEqualToValue(true) prntRef.observeSingleEventOfType(.Value, withBlock: {(snap) in //snap containing all the Users that carry that recipeID in their favourite section }) 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM