如何正确构建 Firebase 数据库以方便阅读和删除

Bob*_*Bob 2 ios firebase swift firebase-realtime-database

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

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

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

USERS_REF.child(uid).child("favorites").childByAutoId().setValue(["ID": recipeID])
Run Code Online (Sandbox Code Playgroud)

添加食谱?

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

Dra*_*ian 5

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

 app:
  users:
   2ReAGRZlYiV5F2piwMakz59XDzl1: //(uid)
    favorites:
      {172171 : true,
        4123123 : true,..} 
Run Code Online (Sandbox Code Playgroud)
  • 对于追加的最爱: -

      USERS_REF.child(uid).child("favorites").updateChildValues([recipeID: "true"]) 
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,如果您的 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])
        }
    })
    
    Run Code Online (Sandbox Code Playgroud)
  • 对于更新的最爱: -

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

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

     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")
         }
    })
    
    Run Code Online (Sandbox Code Playgroud)
  • 检索已知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 
     })
    
    Run Code Online (Sandbox Code Playgroud)