【问题标题】:How to read data from Firebase realtime database using loop如何使用循环从 Firebase 实时数据库中读取数据
【发布时间】:2020-05-12 08:03:43
【问题描述】:

如何通过 indexPath 或类似的方式从 firebase 实时数据库中读取数据?

这是我的基础:

JSON:

    {
  "2020" : {
"May" : {
      "01" : {
        "Room:2" : {
          "Shift2" : {
            "3" : {
              "breaks" : {
                "break d2M" : {
                  "endTime" : "00:39:22",
                  "startTime" : "00:24:17",
                  "totalTime" : "0 h 15 min 5 sec",
                  "totalTime70" : "905"
                }
              },
              "endNotes" : {
                "Notes" : "15 boxes worth also filled and sealed and labelled as cutter broke.",
                "Pod" : "A-35",
                "customer" : "Mc",
                "numberOfPeople" : "4",
                "quantity" : "18432",
                "reasonOfRejects" : "Seal",
                "rejects" : "5",
                "teamLeader" : "Lydia "
              },
              "times" : {
                "endCleaning" : "01:32:14",
                "endTime" : "01:32:12",
                "endTime70" : "15927",
                "setUpToEndCleaning" : "4 h 25 min 30 sec",
                "startCleaning" : "01:32:13",
                "startRunToEndEun" : "4 h 25 min 27 sec",
                "timeOfCleaning" : "0 h 0 min 1 sec",
                "timeOfCleaning70" : "1",
                "timeOfWork" : "4 h 25 min 27 sec",
                "timeOfWork70" : "15930"
              }
            }
          }
        }
      },
      "22" : {
        "Shift1" : [ null, {
          "breaks" : {
            "break 50B" : {
              "endTime" : "8:28:56 AM",
              "startTime" : "8:28:55 AM",
              "totalTime" : "0 hours  0 minutes  1 seconds",
              "totalTime70" : "1"
            },
            "break NLr" : {
              "endTime" : "8:28:12 AM",
              "startTime" : "8:28:11 AM",
              "totalTime" : "0 hours  0 minutes  1 seconds",
              "totalTime70" : "1"
            }
          },
          "endNotes" : {
            "Notes" : "Test note",
            "Pod" : "B-22",
            "customer" : "Germany",
            "numberOfPeople" : "9",
            "quantity" : "4200",
            "reasonOfRejects" : "Test",
            "rejects" : "30",
            "teamLeader" : "Borys"
          },
          "issues" : {
            "Issue d0c" : {
              "Note" : "fight",
              "Type" : "Multivac - not sealing",
              "issueStartTime" : "8:28:09 AM",
              "solvedTime" : "8:28:10 AM",
              "timeOfIssue" : "0 hours  0 minutes  1 seconds",
              "timeOfIssue70" : "1"
            },
            "Issue nCP" : {
              "Note" : "sdf sdfgsdfg ",
              "Type" : "Eric - not dosing correctly",
              "issueStartTime" : "8:28:17 AM",
              "solvedTime" : "8:28:19 AM",
              "timeOfIssue" : "0 hours  0 minutes  2 seconds",
              "timeOfIssue70" : "2"
            }
          },
          "main" : {
            "didSend" : "NO",
            "id" : "ROOM2POD3",
            "numberOfTargets" : "3999",
            "product" : "PRODUCT: HFN-0007 Cajun Spice Mix / Cajun Kryddmix / Cajun Spice Mix 4g"
          },
          "times" : {
            "endCleaning" : "8:28:59 AM",
            "endTime" : "8:28:45 AM",
            "endTime70" : "48",
            "setUpTime" : "0 hours  0 minutes  30 seconds",
            "setUpTime70" : "30",
            "startCleaning" : "8:28:48 AM",
            "startSetUpTime" : "8:27:27 AM",
            "startTime" : "8:27:57 AM",
            "timeOfCleaning" : "0 hours  0 minutes  11 seconds",
            "timeOfCleaning70" : "11",
            "timeOfWork" : "0 hours  1 minutes  2 seconds",
            "timeOfWork70" : "62"
          }
        }, {
          "breaks" : {
            "break tmQ" : {
              "endTime" : "8:34:37 AM",
              "startTime" : "8:34:35 AM",
              "totalTime" : "0 h 0 min 2 sec",
              "totalTime70" : "2"
            }
          },
          "endNotes" : {
            "Notes" : "I have no idea",
            "Pod" : "C-35",
            "customer" : "HeliHansen",
            "numberOfPeople" : "8",
            "quantity" : "900",
            "reasonOfRejects" : "Something",
            "rejects" : "20",
            "teamLeader" : "Mark"
          },
          "issues" : {
            "Issue Epe" : {
              "Note" : "dsfgsdfg",
              "Type" : "Hot Water Tank - hot water has ran cold",
              "issueStartTime" : "8:34:24 AM",
              "solvedTime" : "8:34:25 AM",
              "timeOfIssue" : "0 h 0 min 1 sec",
              "timeOfIssue70" : "1"
            },
            "Issue fEq" : {
              "Note" : "sdfgsdfg",
              "Type" : "Hot Water Tank - hot water has ran cold",
              "issueStartTime" : "8:34:28 AM",
              "solvedTime" : "8:34:33 AM",
              "timeOfIssue" : "0 h 0 min 5 sec",
              "timeOfIssue70" : "5"
            }
          },
          "main" : {
            "didSend" : "NO",
            "id" : "UFNGU877",
            "numberOfTargets" : "800",
            "product" : "PRODUCT: HFN-0006 Cajun Spice Mix / Cajun Kryddmix / Cajun Spice Mix 2g"
          },
          "times" : {
            "endCleaning" : "8:35:15 AM",
            "endTime" : "8:35:09 AM",
            "endTime70" : "53",
            "setUpTime" : "0 h 0 min 15 sec",
            "setUpTime70" : "15",
            "startCleaning" : "8:35:10 AM",
            "startSetUpTime" : "8:34:01 AM",
            "startTime" : "8:34:16 AM",
            "timeOfCleaning" : "0 h 0 min 5 sec",
            "timeOfCleaning70" : "5",
            "timeOfWork" : "0 h 0 min 59 sec",
            "timeOfWork70" : "59"
          }
        }, {
          "breaks" : {
            "break DKf" : {
              "endTime" : "10:20:05",
              "startTime" : "10:20:04",
              "totalTime" : "0 h 0 min 1 sec",
              "totalTime70" : "1"
            },
            "break s8y" : {
              "endTime" : "10:20:22",
              "startTime" : "10:20:20",
              "totalTime" : "0 h 0 min 2 sec",
              "totalTime70" : "2"
            }
          },
          "endNotes" : {
            "Notes" : "Test test",
            "Pod" : "C-35",
            "customer" : "Algeier",
            "numberOfPeople" : "9",
            "quantity" : "11000",
            "reasonOfRejects" : "Test",
            "rejects" : "500",
            "teamLeader" : "Natan"
          },
          "issues" : {
            "Issue Xjh" : {
              "Note" : "buvbtg",
              "Type" : "Hot Water Tank - hot water has ran cold",
              "issueStartTime" : "10:20:14",
              "solvedTime" : "10:20:18",
              "timeOfIssue" : "0 h 0 min 4 sec",
              "timeOfIssue70" : "4"
            }
          },
          "main" : {
            "didSend" : "NO",
            "id" : "NATAN",
            "numberOfTargets" : "10000",
            "product" : "PRODUCT: HFN-0008 Cashews 20g"
          },
          "times" : {
            "endCleaning" : "10:21:04",
            "endTime" : "10:20:47",
            "endTime70" : "40",
            "setUpTime" : "0 h 0 min 23 sec",
            "setUpTime70" : "23",
            "setUpToEndCleaning" : "0 h 1 min 20 sec",
            "startCleaning" : "10:20:48",
            "startSetUpTime" : "10:19:44",
            "startTime" : "10:20:07",
            "timeOfCleaning" : "0 h 0 min 16 sec",
            "timeOfCleaning70" : "16",
            "timeOfWork" : "0 h 0 min 57 sec",
            "timeOfWork70" : "57"
          }
        } ]
      }

我想阅读所有“numberOfTargets”并打印这些值。我怎样才能制作这样的路径: “2020 -> 5 月 -> 11 ->(第一个索引)-> 主要 -> numberOfTargets”? 它不是恒定的,所以我不知道它的名称。是否可以通过索引号来做到这一点? 我尝试了不同的方法,但我没有找到解决方案。

我也尝试过类似的方法,但我认为这是错误的,我不知道该怎么做:)

    func allTargets() {
    let ref1 = ref.child("\(av.currentYear())/\(av.currentMonth())/\(av.currentDay())")
    ref1.observeSingleEvent(of: .value) { (snapshot) in
        let value = snapshot.value as? NSDictionary
        let numberOfTargets = value?.allKeys
        print(numberOfTargets)
    }
}

【问题讨论】:

  • 最好将代码和结构包含为 文本,而不是图像。这样,如果答案中需要它们,可以复制和粘贴它们。要获取您的 Firebase 结构,请使用 Firebase 控制台->导出 JSON,然后复制并粘贴您的结构的 sn-p。

标签: ios swift database firebase indexing


【解决方案1】:

有很多方法可以获取这些数据;我将展示两个,一个编码解决方案,然后是一个替代结构解决方案

编码方案:

ID 未知,但这些 ID 的父节点的路径是未知的。因此,创建对最知名键(父键,11)的引用,然后读取下面的子节点。

将它们组装成一个 DataSnapshots 数组(以保持顺序),然​​后遍历该数组,在 numberOfTargets 处获取子数据。

func readNumberOfTargets() {
    let mayRef = self.ref.child("2020").child("May") //self.ref points to my firebase
    let dayRef = mayRef.child("11")
    dayRef.observeSingleEvent(of: .value, with: { snapshot in
        let childSnaps = snapshot.children.allObjects as! [DataSnapshot]
        for child in childSnaps {
            let mainSnap = child.childSnapshot(forPath: "main")
            let numTargets = mainSnap.childSnapshot(forPath: "numberOfTargets")
            print(child.key, numTargets)
        }
    })
}

和输出

Jan Snap (numberOfTargets) 80
borys Snap (numberOfTargets) 77
ftfvdf Snap (numberOfTargets) 99

请注意,numberOfTargets 似乎被存储为字符串,所以如果是这种情况,请使用它

let numTargets = mainSnap.childSnapshot(forPath: "numberOfTargets").value as? String ?? "No Targets"

如果它被存储为 Int,请使用它

let numTargets = mainSnap.childSnapshot(forPath: "numberOfTargets").value as? Int ?? 0

替代结构解决方案:

通常的做法是对 NoSQL 数据库中的数据进行非规范化,并使用复合键来获取它。在这种情况下,我们将两者都做并创建一个单独的节点,该节点包含一个高度扁平的结构,非常容易获得

TargetCount
   2020_May_11_Jan: 80
   2020_May_11_borys: 77
   2020_May_11_ftfvdf: 99

因此,当您想要每个节点的目标计数时,可以根据路径读取它。也就是说,这个节点是什么时候创建的

2020
   May
      11
         Jan

创建该节点时会返回密钥“Jan”(根据您的问题的未知密钥)。所以同时将该路径写入 TargetCount 节点

TargetCount
   2020_May_11_Jan: 80

当您遍历子节点时,您将通过解构键字符串来了解未知数

2020_May_11 and then the Jan value is 80

如果您想隔离特定日期,也可以这样做

TargetCount
   2020_May_11
      Jan:80
      borys: 77
      ftfvdf: 99

【讨论】:

  • 非常感谢!你帮了我很多:)
猜你喜欢
  • 2021-07-18
  • 1970-01-01
  • 2021-02-12
  • 2022-01-23
  • 2022-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多