我正在创建一个食谱查找应用程序,基本上我有一个"收藏夹"如果用户收藏了食谱,他们将能够在应用程序的“收藏夹”选项卡中轻松访问该食谱。基本上这是我现在的结构:
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并轻松删除它们?
答案 0 :(得分:4)
您可能想考虑将收藏夹设为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
})