如何通过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->五月-> 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)
}
}
答案 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