一尘不染

如何正确构建Firebase数据库以使其易于读取和删除

swift

我正在创建一个寻找食谱的应用程序,基本上,我有一个“收藏夹”,如果用户收藏了一个食谱,他们将可以在应用程序的“收藏夹”选项卡中轻松访问它。基本上这是我现在的结构:

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

基本上,每当他们转到“收藏夹”选项卡时,我都需要所有配方ID的列表,以便可以进行API调用来检索配方信息。我基本上是在浏览字典。我还希望能够允许用户取消收藏该食谱,因此将其从数据库中删除。如果使用以下方法,如何将其删除:

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

添加食谱?

有没有更好的结构可以用来读取配方ID并轻松删除它们?


阅读 258

收藏
2020-07-07

共1个答案

一尘不染

您可能想考虑将收藏夹作为NSDictionary:-

 app:
  users:
   2ReAGRZlYiV5F2piwMakz59XDzl1: //(uid)
    favorites:
      {172171 : true,
        4123123 : true,..}
  • 对于 追加 的最爱: -
      USERS_REF.child(uid).child("favorites").updateChildValues([recipeID: "true"])
    

请注意,如果您的recipeID是唯一的,即在收藏夹节点上不存在,则只有它会追加该值,如果recipieID已经存在,它将仅更新其值(不希望使用此值进行追加,请查找下一个选项)

要么

    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])
    }
})
  • 对于最喜欢的 更新 :-

     USERS_REF.child(uid).child("favorites").updateChildValues([recipeID: "false"])  //User doesn't like's the recipe anymore
    
  • 对于 删除 从收藏夹: -

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

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

    })

  • 虽然 检索 对于已知 key-value

     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
    

    })

2020-07-07