【问题标题】:How to filter Firebase data in Swift from another parent?如何从另一个父级过滤 Swift 中的 Firebase 数据?
【发布时间】:2018-11-17 18:52:13
【问题描述】:

原文:我遇到了一些我无法弄清楚的事情: 我有一个客户列表及其数据,我有一个日历日期列表,客户在 Firebase 中标记为可用。我需要弄清楚如何根据日历排除客户。 我搜索了一下,发现这个问题几乎可以回答我的问题:

更新:我现在已将 Firebase 数据库更改为不必分离父母,而是将其包含在客户中

How to filter Firebase data in Swift?

        // This is my new code from the link above
        ref.child("customers").queryOrdered(byChild: "calendar").
        queryEqual(toValue: true).observe(.childAdded, with: { snapshot in


        let snapshotDict = snapshot.value as? NSDictionary

            let name = snapshotDict?["Name"] as! String
            let email = snapshotDict?["Email"] as! String
            let rating = snapshotDict?["Rating"] as! String
            let key = snapshot.key

            self.posts.insert(postStruct(name: name, email: email, rating: rating, key: key), at: 0)
            self.tableView.reloadData()

因此,如果我只检查“日历”的值是否 = true,这将有效。但是我在日历中有几个键和值,我不知道下一步。我的数据库如下所示:

    customers:
      - sk1239sdkq2312lk
            - calendar
                  - 9. june, 2018
                       - 1 : 10:00    
      - lk3j4590gsdflkj2
            - calendar
                  - 9. june, 2018
                       - 1 : 10:00    
      - x98123jasdhasdss
            - calendar
                  - 9. june, 2018
                       - 3 : 12:00    

我只想在我的表中插入两个第一个客户,他们有 9. June, 2018 和 1 : 10:00。

我有我要查找的日期(2018 年 6 月 9 日)和时间(10:00),但没有数字(1、2、3)。

我该怎么做?

【问题讨论】:

  • 请将您的 Firebase 结构 sn-p 包含为文本,请不要包含链接或图片。如果链接断开,它将使您的问题无效。最重要的是,当有人回答时,他们可能需要包含您的结构,我们真的不喜欢重新输入所有这些。如果是文本,我们可以复制粘贴。看看Linked Images Are Evil
  • 谢谢!除了提到的类似问题中的代码外,我没有针对此问题的任何代码。我猜有些代码是相似的。有人帮助我将图像从链接更改为嵌入,他们在那里展示了我的数据库是如何组织的。
  • 再次提醒,请不要包含链接或图片我们发短信。如您所见,如果我的答案包含您的 Firebase 结构,则必须重新输入。要获取结构的 sn-p,请使用 Firebase 控制台->导出 JSON,打开文本文件并将文本的 sn-p 复制并粘贴到问题中。
  • 另外,根据您的结构,您将无法获得所需的内容,因此需要对其进行更改。最后,请不要使用数组——它们真的不适合 NoSQL 数据库。请参阅我对this questionanother answer 的回答
  • 感谢大家的回复,我现在已经更新了我的问题和代码,并删除了所有的图片。

标签: swift firebase firebase-realtime-database


【解决方案1】:

实时数据库和 Cloud Firestore 都不支持对多个集合(或子集合)进行单一查询。

在检索到所有客户后,您可以保留对日历集合的引用并在客户端对其进行查询。这有明显的缺点。

另一种选择是在 Customer 模型中包含一个默认为 false 的字段(例如 usedCalendar),然后使用 Firebase Cloud Functions 保持该字段值一致。您需要将 onCreate()onDelete() 挂钩添加到 calendar 集合并更新相应客户的 usedCalendar 值。

【讨论】:

  • 非常感谢您。我现在更新了我的问题,因为我改变了我使用数据库的方式..
【解决方案2】:

这似乎归结为正确构建您的数据库。一旦完成,它应该很容易。首先,除非有充分的理由不使用,否则请使用 Firestore。 ...假设您可以使用 Firestore,似乎您将拥有一个(相当标准的)根级别 users 集合,其中每个 user 都有一个名为 operating 的(子)集合,其中包含 uid 的文档。每个文档都有一个名为activity 的属性,可以是“会议”或“假期”或“忙碌”等。

我正在做类似的事情来存储我的用户发货地点。

Firestore supports compound queries 所以,填写你的日历应该很容易。

【讨论】:

  • 您好,很遗憾,我现在无法将数据库更改为 Firestone。但正如您在我编辑的帖子中看到的那样,我现在改变了管理实时数据库的方式。将来我会研究 Firestone。
  • 对于这个问题,你有其他方法吗?
猜你喜欢
  • 2017-01-31
  • 1970-01-01
  • 2017-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-19
  • 1970-01-01
  • 2018-02-28
相关资源
最近更新 更多