我有一个tableView,用于获取Firebase数据库中的所有用户。 tableView单元格只显示用户名,电子邮件和个人资料图像。问题是我还希望用户在用户节点中的UID下存储一个属性密钥,该属性密钥将包含他们在应用程序中选择的属性数组(此示例中的属性将是[“food”,“drink” “,”sports“])我希望只显示与当前用户签名具有3个或更多相同属性的用户。
第一个问题是我不知道如何在我的UID下向我的firebase数据库添加一个属性数组,因为它保存为一个属性节点,其中包含从索引0到索引2的列表(3个键0, 1,2)用字符串“食物”,“饮料”,“运动”。我也不知道这是否是最佳方式。任何帮助将不胜感激。
第二个问题是我不知道如何获取新用户并将其添加到我的tableView中仅用户具有与当前用户相同的属性。 以下是我当前获取所有用户的代码,没有任何过滤:
func fetchUser() {
FIRDatabase.database().reference().child("users").observe(.childAdded, with: { (snapshot) in
if let dictionary = snapshot.value as? [String: AnyObject] {
let user = User()
user.setValuesForKeys(dictionary)
self.users.append(user)
DispatchQueue.main.async(execute: {
self.tableView.reloadData()
})
}
}, withCancel: nil)
}
class User: NSObject {
var name: String?
var email: String?
var numberId: String?
var attributes: String?
var password: String?
var profileImageUrl: String?
}
答案 0 :(得分:1)
首先。不要使用数组。它们非常具有情境性,通常还有其他更好的方法来存储数据。
回答第一个问题:
考虑到要存储用户数据和某些属性的Firebase结构,这里有一个可以执行此操作的结构
users
uid_0
name: "Frank"
attribs
fav_food: "Pizza"
fav_car: "Camaro"
并阅读上述节点
usersRef.observe(.value, with: { snapshot in
for child in (snapshot?.children)! {
let snap = child as! FDataSnapshot
let dict = snap.value as! [String: AnyObject]
let name = dict["name"] //it's Frank
let attribs = dict["attribs"] as! [String: AnyObject]
let food = attribs["fav_food"] //pizza
let car = attribs["fav_car"] //camaro
}
}
回答第二个问题:
第二个问题是我不知道如何获取新用户 将它添加到我的tableView只有用户具有相同的属性 当前用户。这是我当前获取所有用户的代码, 没有任何过滤:
所以你要问的是如何找到与当前用户具有相同属性的其他用户。
Firebase没有能力对多个孩子进行比较(即没有:食物= =披萨和汽车= Camaro)。
一种选择是将attribs存储为字符串
pizza_Camaro
然后你可以轻松检查attribs'字符串相等。
另一个选项是递归查询。这是10k英尺水平的想法
query for all users where fav_food is pizza
query from that set of users where fav_car is Camaro
query from that set of users where....
你明白了。它不是超级高效的,但对于小型数据集,它可以工作。