如何检查Firebase数据库中的3个或更多值是否相同?

时间:2016-12-06 13:34:31

标签: swift xcode firebase swift3 firebase-realtime-database

我目前正在尝试返回表格视图中的所有用户,这些用户有3个属性等于" art"," music" &安培; "体育&#34 ;.具有3个不等于这3个字符串的属性的其他用户将不会显示在我的表视图中。我该如何实现这一目标?目前,我只能检查 ONE 属性是否等于 ONE 字符串,如下例所示。我有一个下面的数据库树的图像,以及我目前拥有的代码。任何感谢任何帮助。谢谢!

enter image description here

class User: NSObject {

    var name: String?
    var email: String?
    var numberId: String?

    var attribute1: String?
    var attribute2: String?
    var attribute3: String?

    var password: String?
    var profileImageUrl: String?
}

func fetchUser() {

        FIRDatabase.database().reference().child("users").queryOrdered(byChild: "attribute1").queryEqual(toValue: "art").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)
    }

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! UserCell

        let user = users[indexPath.row]
        cell.textLabel?.text = user.name
        cell .detailTextLabel?.text = user.email

        if let profileImageUrl = user.profileImageUrl {

            cell.profileImageView.loadImageUsingCachWithUrlString(urlString: profileImageUrl)
        }

        return cell
    }

1 个答案:

答案 0 :(得分:2)

Firebase的一个(主要的,我认为)限制是它无法一次过滤多个键。执行此操作的一般策略是按照您认为将为您提供最小数据集的密钥进行过滤,并按客户端上的其余密钥进行过滤。因此,举例来说,如果你认为你当前的过滤器会给你最小的一组(或者如果它们都给出了相同的值),那么在你追加用户之前,请检查:

if user.attribute2 == "music" && user.attribute3 == "sports" {
    self.users.append(user)
}

您可以在拥有所有用户后过滤列表。但关键是Firebase目前不允许进行此类过滤,因此您需要在客户端进行此操作。

self.users = self.users.filter({ $0.attribute2 == "music" && $0.attribute3 == "sports" })