我正在创建一个寻找食谱的应用程序,基本上,我有一个“收藏夹”,如果用户收藏了一个食谱,他们将可以在应用程序的“收藏夹”选项卡中轻松访问它。基本上这是我现在的结构:
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并轻松删除它们?
您可能想考虑将收藏夹作为NSDictionary:-
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 对
key-value
let prntRef = USERS_REFFIR.child("users").queryOrderedByChild("favorites/\(recipeID)").queryEqualToValue(true)
//snap containing all the Users that carry that recipeID in their favourite section