【发布时间】:2018-12-30 17:48:06
【问题描述】:
我需要从 Firebase 中的数据库中获取键值并附加到数组中。 这是我的查询:
let dbHandle = Database.database().reference().child("userRecords").child(uid).queryOrdered(byChild: self.startDate).queryEnding(atValue: self.finishDate)
dbHandle.observeSingleEvent(of: .value, with: { (snapshot) in
guard let foundRecords = snapshot.children.allObjects as? [DataSnapshot] else {return}
for record in foundRecords{
let recordName = record.childSnapshot(forPath: "recordName").value as! String
let recordTime = record.childSnapshot(forPath: "timestamp").value as! String
let recordRate = record.childSnapshot(forPath: "recordRate").value as! String
self.records.append(["equipment": recordName as AnyObject,"date": recordTime as AnyObject, "rate": recordRate as AnyObject])
}
这是我的数据库结构:
Snap (record1) {
"-LUmY5jC-jC6vwpQj26S" = {
recordName = "record1";
recordRate = "1.2";
timestamp = "27/12/2018 at 01:59";
};
"-LUmaAcxLcz1Oif4-L8n" = {
recordName = "record1";
recordRate = "1.0";
timestamp = "25/12/2018 at 02:15";
};}
JSON:
{"userRecords" : {
"l1GIK43GCUbdnnyYsrQnO3JLnjV2" : {
"record1" : {
"-LUmY5jC-jC6vwpQj26S" : {
"recordName" : "record1",
"recordRate" : "1.2",
"timestamp" : "27/12/2018 at 01:59"
},
"-LUmaAcxLcz1Oif4-L8n" : {
"recordName" : "record1",
"recordRate" : "1.0",
"timestamp" : "25/12/2018 at 02:15"
}
},
"record2" : {
"-LUmY7GRwo6_Iq6IqbN_" : {
"recordName" : "record2",
"recordRate" : "1.1",
"timestamp" : "27/12/2018 at 01:59"
},
"-LUmaAcr1P2mQrtSdFWi" : {
"recordName" : "record2",
"recordRate" : "1.2",
"timestamp" : "25/12/2018 at 02:15"
}
}
}
}, }
查询抛出“线程 1:信号 SIGABRT”。所有对象都正确连接。 当我将查询更改为:
dbHandle.observeSingleEvent(of: .childAdded, with: { (snapshot) in
查询工作正常。
结果被附加到我的数组“记录”中,然后存储到字典中返回到 Firebase:
let reportsRef = Database.database().reference().child("reports").child(uid)
let reportDict = ["reportNumber": reportNumber, "company": self.companyTxtField.text!, "address": self.addressTxtField.text!, "start": self.startDate, "finish": self.finishDate, "records": self.records] as [String : Any]
reportsRef.childByAutoId().setValue(reportDict)
问题:
- 我只从“record1”获取附加到我的数组的值
虽然至少还有“record2”。如何从“foundRecords”中的所有对象中获取所有值并将这些值附加到数组
records: [[String: AnyObject]]? - 为什么“observeSingleEvent(of: .value”会报错?
*时间戳值尚未转换为 NSDate 格式用于演示目的
【问题讨论】:
-
您能否编辑您的问题以包含来自
Database.database().reference().child("userRecords").child(uid)的实际 JSON(作为 JSON 文本,请不要截图)?您可以通过单击Firebase Database console 上溢出菜单 (⠇) 中的“导出 JSON”链接来获取此信息。也可能有更好的错误消息。要捕获错误消息,请右键单击红色指示器和“Reveal in Issue Navigator”。 -
已更新。错误信息很明显
Could not cast value of type 'NSNull' (0x10563cde0) to 'NSString' (0x103e2f5d8).
标签: ios swift firebase firebase-realtime-database