【问题标题】:Query an array from Firestore从 Firestore 查询数组
【发布时间】:2019-03-06 11:18:22
【问题描述】:

我在 Firestore 中存储了一些字符串和 2 个数组,现在我正在尝试接收它们,但我不知道如何接收它们。好吧,字符串工作正常,但我不知道如何查询数组。我收到错误代码:

线程 1:致命错误:在展开可选值时意外发现 nil

这是我的代码:

                            //For-loop
                        for document in QuerySnapshot!.documents
                        {
                            self.list.removeAll()
                            //let document = QuerySnapshot!.documents
                            let data = document.data()

                            let data1 = data["Dog"] as? String
                            let data2 = data["Person"] as? String
                            let data3 = data["What"] as? String
                            let data4 = data["Time"] as? String
                            let data5 = data["Date"] as? String
                            let data6 = data["Kilometers"] as? String
                            let data7 = data["Timer"] as? String
                            let data8 = data["Latitude"] as? Array<Double>
                            let data9 = data["Longitude"] as? Array<Double>

                            let txt = listTxt(dog: data1!, person: data2!, action: data3!, time: data4!, date: data5!, kilometers: data6!, timer: data7!, latitude: data8 ?? [], longitude: data9 ?? [])

                            print(txt)

                            tempTxt.append(txt)

                        }
                        self.list = tempTxt
                        self.tableView.reloadData()
                    }

数组存储为Double,重点是将其接收为double,然后再次将其转换为CLLocationCoordinate2D,这样我就可以将坐标用于地图。如果您知道如何解决此问题,请告诉我。 :)

类内:

class listTxt
{
    var dog: String
    var person: String
    var action: String
    var time: String
    var date: String
    var kilometers: String
    var timer: String
    var latitude: [String]
    var longitude: [String]

    init(dog: String, person: String, action: String, time: String, date: String, kilometers: String, timer: String, latitude: [String], longitude: [String])
    {
        self.dog = dog
        self.person = person
        self.action = action
        self.time = time
        self.date = date
        self.kilometers = kilometers
        self.timer = timer
        self.latitude = latitude
        self.longitude = longitude
    }

在历史单元内

    class HistoryCell: UITableViewCell
{

    @IBOutlet weak var DogName: UILabel!
    @IBOutlet weak var Person: UILabel!
    @IBOutlet weak var Action: UILabel!
    @IBOutlet weak var Date: UILabel!
    @IBOutlet weak var Time: UILabel!
    @IBOutlet weak var timer: UILabel!
    @IBOutlet weak var kilometer: UILabel!
    var latitude: [String] = []
    var longitude: [String] = []

    func setCell(list: listTxt)
    {
        DogName.text = list.dog
        Person.text = list.person
        Action.text = list.action
        Date.text = list.date
        Time.text = list.time
        timer.text = list.timer
        kilometer.text = list.kilometers
        latitude = list.latitude
        longitude = list.longitude
    }
}

Firestore 数据:

提前致谢。 :)

【问题讨论】:

  • @Saurabh 你的意思是我应该使用“as?String”而不是Double?而不是将其转换为 Int,然后从 int 转换为 Double? :)
  • 不,这是行不通的,因为您可能会得到带十进制的字符串值。如果我错了,请纠正我。
  • @Saurabh 是的,从一开始就是 CLLocationCoordinate2D。我将其转换为将数据插入 Firestore
  • 好吧,你可能会得到空字符串或 nil 值,如果你尝试将它们强制转换为 Double,将引发错误。所以在转换之前,请检查值是否不为空或 nil。

标签: ios arrays swift google-cloud-firestore


【解决方案1】:

尝试替换以下代码行:

let data8 = data["latitude"] as? [Double]
let data9 = data["longitude"] as? [Double]

原因:使用错误的键访问数据

【讨论】:

    【解决方案2】:

    您尝试过如下方式吗?

     let data8 = data["latitude"] as? [Double]
     let data9 = data["longitude"] as? [Double]
    

    实际上,您正在使用错误的键访问数据...“纬度”、“经度”是有效键,但您正在使用数据快照中不存在的“纬度”、“经度”检索数据

    注意在存储数据时请检查您是以双精度数组的形式发送的数据。

    【讨论】:

    • 这是我保存它的时候:` var latitudes:[Double] = [] var longitudes:[Double] = []` 我会试试你说的,但我想我已经试过了:/
    • 所以你要保存 double 的空数组?
    • 也请给我看看你正在保存的数据字典。
    • 嗯,首先我有这个。 (在我的第一个视图中,我将其保存到 Firestore)var locations: [CLLocationCoordinate2D] = [] var latitudes:[Double] = [] var longitudes:[Double] = [] ViewDidLoad() { latitudes = locations.map({ $0.latitude }) longitudes = locations.map({ $0.longitude }) } SaveToFireStore() { //A lot of code before this, but nothing that includes lat and long. "latitude": latitudes, "longitude": longitudes ] }
    • 检查编辑的答案实际上您正在使用错误的键访问数据... "latitude" , "longitude" 是有效键,但您正在使用 "Latitude" , "Longitude" 进行检索,这些键不存在于您的数据快照。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多