ios - 使用 Firebase 将值与值数组进行比较。 swift

标签 ios swift firebase firebase-realtime-database

我有一个值需要与值数组进行比较。基本上,用户需要检查它是否与另一个用户具有相同的项目。但是我正在努力解决这个问题,因为我如何获得一组用户的项目?通常当你观察到一个值时,你会做这样的事情:

Database.database().reference(withPath: "users/\(userID)/itemList").observeSingleEvent...

但是,当涉及到用户数组 itemList 时,如果有多个 ID,如何实现呢?我想将一个或多个用户项目与其他用户项目进行比较,并检查它们是否匹配,以便对匹配的用户数组进行排序。

如果已经有这方面的示例,请帮助指导我。

更新

这是我的数据结构:

{
  "users": {
    "EWJGFYmVTzOiHgnq42ebhrg2fj": {
      "firstName": "Friederike",
      "itemList": [
        2: true,
        3: true,
        0: true
      ]
    },

    "C076OYmVTzOiHgnq4wPQtY2XpED2": {
      "firstName": "Ian",
      "itemList": [
        0: true,
        1: true,
        3: true
      ]
    },
    "Juoiuf0N6qNmkm32jrtu6X6UK62": {
      "itemList": [
        0: true
      ],
      "firstName": "Jack"
    }
  }
}

更新 2.0

有了下面的答案,我可以通过项目表进行查询,但仍然无法查询匹配的键,因为可能有多个 数组,因此我不能用它来过滤或任何东西。

最佳答案

好的,那么对于您当前的数据结构,您必须查询用户下的所有节点,然后比较数组,这是非常低效的。在不修改结构的情况下,没有直接或简单的方法可以做到这一点。所以我建议你修改你的数据结构,让每个项目都有一个拥有它的所有用户的列表。像这样:

{
  "items": {
    "0": {
      "EWJGFYmVTzOiHgnq42ebhrg2fj": "Friederike",
      "C076OYmVTzOiHgnq4wPQtY2XpED2": "Ian",
      "Juoiuf0N6qNmkm32jrtu6X6UK62": "Jack"
    },

    "1": {
      "C076OYmVTzOiHgnq4wPQtY2XpED2": "Ian"
    },

    "2": {
      "EWJGFYmVTzOiHgnq42ebhrg2fj": "Friederike"
    }
    //....
  }
}

根据您想要显示的内容,您可能想要存储更多信息,而不仅仅是用户 UID 和用户名。您可以使用如下查询查询所有与您拥有相同项目的用户:

let ref = Database.database().reference()
// assuming you already have the current users items stored in an array
for item in items {
    ref.child("items").child(String(item)).observeSingleEvent(of: .value, with: { snap in
        for child in snap.children {
            let child = child as? DataSnapshot
            if let key = child?.key, let name = child?.value as? String {
                // do something with this data
            }
        }
    })
}

Firebase 数据库是 noSQL,所以数据应该是 denormalized或复制以便优化查询。 Firebase 实际上建议您避免 nesting data .看看这个question获取更多信息。

希望对你有帮助

与评论中提出的问题相关的代码

假设您将具有相同项目的用户的 UID 或名称存储在字符串数组中,您可以 prevent duplicates使用 .contains()

var namesWithMatchingItems = [String]()

if !namesWithMatchingItems.contains(nameYouJustFetched) {
    namesWithMatchingItems.append(nameYouJustFetched)
}

关于ios - 使用 Firebase 将值与值数组进行比较。 swift ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48165916/

相关文章:

ios - 如何为 AppDelegate 中的所有 View Controller 独立更改左右栏按钮项文本属性?

swift - 设置 UIImageView 宽度、高度、长宽比和约束 X、Y

ios - 使用 Firebase 的 Google 注销按钮

ios - 核心数据关系命名约定

ios - FBAudienceNetwork : setting FBNativeAd into FBMediaView stacks the UI

ios - 如何在 Xcode Storyboard上显示一段文字?

firebase - 使用 firebase 时真的需要本地状态管理吗?

android - 不活动,与服务断开连接 - 使用 Android Firebase

ios - 将 PFObject 查询到 swift 数组中

swift - 无法在 swift ("if"或可能 "while"中创建正确的函数)