我在Firestore
和Firebase
库上是一个新手。有人可以解释如何从我的object
检索字段并将其存储在代码中的变量中吗?我正在尝试从Firestore中的每个对象访问所有latMin
,latMax
,lonMin
和lonMax
,以及是否可以通过以下方式检索每个字段:相同的名称(例如,来自位置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遍文档,但找不到解决方案。感谢您抽出宝贵的时间阅读我的帖子。
答案 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想要完成的工作。
问题中的结构在一个集合下列出了多个位置-可以,但是将这些位置分组在一起。如果我们将其更改为每个集合仅占一个位置,则可以对其进行迭代并更轻松地获取数据。
答案 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()
。