如何从Cloud Firestore上的对象检索值?迅速

时间:2018-08-31 08:44:31

标签: ios swift firebase object google-cloud-firestore

我在FirestoreFirebase库上是一个新手。有人可以解释如何从我的object检索字段并将其存储在代码中的变量中吗?我正在尝试从Firestore中的每个对象访问所有latMinlatMaxlonMinlonMax,以及是否可以通过以下方式检索每个字段:相同的名称(例如,来自位置1和2的latMin)。我不知道这是否可行,或者有更好的方法来组织我的Firebase

这是我的Cloud Firebase:Here is the image for my Firestore, requested in the comments.

place 1:  //This is an Object in my Firestore

  //Field = Number : Value ----> This is how object is orginazed 

  latMax : 39.727
  latMin : 39.726
  lonMax : -121.7997
  lonMin : -121.8003

place 2: 

  latMax : 39.7559
  latMin : 39.755
  lonMax : -122.1988
  lonMin : -122.1992

我能够毫无问题地访问对象,这是我用来读取Firestore上的文档的功能:

import UIKit
import FirebaseFirestore
import Firebase
import CoreLocation

class SecondViewController: UIViewController, CLLocationManagerDelegate {

//Creating access to locationManager
var locationManager : CLLocationManager!

@IBOutlet weak var latLabel: UILabel!
@IBOutlet weak var lonLabel: UILabel!
@IBOutlet weak var place: UILabel!
@IBOutlet weak var placeImage: UIImageView!


//Storing the pass data that we got from the firt View
var lonStore = String()
var latStore = String()
var fireLon = String()
var fireLat = String()
var lonNumberStore = Double()
var latNumberStore = Double()
var fireLonMax = Double()
var fireLatMax = Double()
var fireLonMin = Double()
var fireLatMin = Double()


override func viewDidLoad() {


    //Here goes some code to display on the SecondViewController
    readArray()

}

func readArray() {

    let placeRef = Firestore.firestore().collection("places")
        placeRef.getDocuments { (snapshot, error) in
        guard let snapshot = snapshot else {
            print("Error \(error!)")
            return
        }
        for document in snapshot.documents {
            let documentId = document.documentID
            let latMax = document.get("latMax") as! String //Getting a nil error
            print(documentId, latMax) //This print all objects

        }
    }
}

我丢失了一些东西,我知道,问题是我找不到在这种情况下需要做的事情的参考,我已经阅读了50遍文档,但找不到解决方案。感谢您抽出宝贵的时间阅读我的帖子。

3 个答案:

答案 0 :(得分:4)

您的readArray代码已超级关闭。只需添加代码即可阅读文档中的各个字段

func readArray()
   self.db.collection("places").getDocuments { (snapshot, err) in
       if let err = err {
           print("Error getting documents: \(err)")
       } else {
           for document in snapshot!.documents {
              let docId = document.documentID
              let latMax = document.get("latMax") as! String
              let latMin = document.get("latMin") as! String
              let lonMax = document.get("lonMax") as! String
              let lonMin = document.get("lonMin") as! String
              print(docId, latMax, latMin, lonMax, lonMin)
           }
       }
}

原始问题中的问题是数据库的结构。这是一种结构,可以与我的答案中的代码匹配,并且更适合OP想要完成的工作。

问题中的结构在一个集合下列出了多个位置-可以,但是将这些位置分组在一起。如果我们将其更改为每个集合仅占一个位置,则可以对其进行迭代并更轻松地获取数据。

enter image description here

答案 1 :(得分:1)

我认为您的地点模型引用了两个对象bestBuy和house。因此,检索方法将是仅从对象中检索数据并将其存储在对象中。意味着您可以直接在plcaes模型中设置所有数据。然后,您可以调用bestBuy和house的getter方法以根据需要检索数据。这是一个示例代码(此处仅检索一个文档),但是您可以通过迭代for循环并将每个文档转换为对象,对所有文档应用相同的代码:-

let docRef = db.collection("cities").document("BJ")

docRef.getDocument { (document, error) in
    if let city = document.flatMap({
      $0.data().flatMap({ (data) in
        return City(dictionary: data)
      })
    }) {
        print("City: \(city)")
    } else {
        print("Document does not exist")
    }
}

但是根据Firestore文档,存储嵌套对象的最佳方法是创建一个子集合,然后将其存储在其文档中。

答案 2 :(得分:0)

自IMO以来,iOS Firestore文档在许多领域都得到了一些澄清:从文档字段中检索值(一旦获得文档)有两种方法-使用Firestore方法(根据文档)并使用Swift的本机方法从字典中获取值。

let query = Firestore.firestore().collection("zipCodes").whereField("california", arrayContains: 90210)

query.getDocuments { (snapshot, error) in

    guard let snapshot = snapshot,
        error == nil else {
            return print("error: \(error!)")
    }
    guard !snapshot.isEmpty else {
        return print("results: 0")
    }

    for doc in snapshot.documents {

        // using firestore's convention
        if let array = doc.get("zipCodes") as? [Int] {
            if array.contains(90211) {
                // doc contains both zip codes
            }
        }

        // using swift's convention
        if let array = doc.data()["zipCodes"] as? [Int] {
            if array.contains(90211) {
                // doc contains both zip codes
            }
        }

    }

}

就安全性和可预测性而言,我个人会尽可能使用Firestore的框架,因此,在所有字段检索中都使用get()