如何使用循环从Firebase实时数据库读取数据

时间:2020-05-12 08:03:43

标签: ios swift database firebase indexing

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

这是我的基础: enter image description here

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->五月-> 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)
    }
}

1 个答案:

答案 0 :(得分: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