【问题标题】:Retrieve all key values from Firebase and append to an array从 Firebase 检索所有键值并附加到数组
【发布时间】: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)

问题:

  1. 我只从“record1”获取附加到我的数组的值 虽然至少还有“record2”。如何从“foundRecords”中的所有对象中获取所有值并将这些值附加到数组records: [[String: AnyObject]]?
  2. 为什么“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


【解决方案1】:

您的代码无法处理的每个 UID 下的 JSON 中都有一个额外的级别。当您观察到.childAdded 时,这不是问题,因为您的完成处理程序会为每个单独的孩子调用。但是当您观察.value 时,您会被调用并带有所有孩子的快照。这意味着你必须自己循环额外的关卡:

let dbHandle = Database.database().reference().child("userRecords").child(uid)
    .queryOrdered(byChild: "timestamp").queryStarting(atValue: 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])
  }
}

【讨论】:

  • 感谢您的建议。对于guard let pushIds = foundRecords.children.allObjects as? [DataSnapshot] else {return},我收到一个新错误Value of type '[DataSnapshot]' has no member 'children'。我以前尝试过这种方法,但无法修复错误。
  • foundRecords 是一个[DataSnapshot],它是一个快照数组。由于children 只存在于每个DataSnapshot 上,我们需要循环遍历foundRecords。我更新了答案中的代码。
  • “它不起作用” 什么不起作用?如果你运行代码会发生什么?如果您在调试器中单步执行,哪一行代码没有按照您的预期执行?
  • 我在第一篇文章中解释了问题所在。我找到了解决方案。我必须得到“记录”的所有键,然后循环。这样它就按预期工作了。
  • 酷。很高兴听到。如果您可以将其发布为答案,其他人可能会从中受益。
猜你喜欢
  • 2018-12-26
  • 2019-03-21
  • 1970-01-01
  • 2018-01-24
  • 2017-12-20
  • 2020-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多