如何从 Firestore 访问和显示正确的字符串?

Posted

技术标签:

【中文标题】如何从 Firestore 访问和显示正确的字符串?【英文标题】:How to access and display the correct String from Firestore? 【发布时间】:2018-09-03 05:32:10 【问题描述】:

这是我在这个很棒的小组中的第二篇文章,过去 5 天我一直在研究如何从 Firestore 获取数据并将其与我当前的用户 location 进行比较。一切似乎都运行良好,除非我实时测试我的应用程序(使用我的 iPhone)。有时它会显示正确的位置,有时它会崩溃或显示随机位置。我正在使用where() 方法从我的Firestore 访问数据,它似乎正在返回我需要的内容。我觉得我在文档中的姓名在我访问信息时无法正常工作。

这是我的代码:

Firebase 截图:

地点 1

地点 2

//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 placeName = String()
var latStore = String()
var lonStore = 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
    latLabel.text = latStore
    lonLabel.text = lonStore

    latMaxRead()
    latMinRead()
    lonMaxRead()
    lonMinRead()


//This is my button to test if I am in the correct place
@IBAction func updateLocation(_ sender: UIButton) 

    //
    if (fireLatMin...fireLatMax).contains(latNumberStore) && (fireLonMin...fireLonMax).contains(lonNumberStore)
        print("Is good place",fireLonMin,fireLonMax,fireLatMin,fireLatMax)
        place.text = placeName
     else 
        print("Is not good place", fireLonMin,fireLonMax,fireLatMin,fireLatMax)
        place.text = "Bad"
    



    func latMaxRead() 
    let docRef = Firestore.firestore()
        docRef.collection("places")
            .whereField("latMax", isGreaterThanOrEqualTo: latNumberStore)
            .getDocuments  (snapshot, error) in
                if error != nil 
                    print("Error getting documents: \(String(describing: error))")
                 else 
                    for document in (snapshot?.documents)! 
                        self.fireLatMax = document.data()["latMax"] as! Double
                        //This is where I pull the placeName on my Firebase
                        self.placeName = document.data()["placeName"] as! String 

                        print("Fire latMax:", self.fireLatMax)
                    
                
    



func latMinRead() 
    let docRef = Firestore.firestore()
    docRef.collection("places")
        .whereField("latMin", isLessThanOrEqualTo: latNumberStore)
        .getDocuments  (snapshot, error) in
            if error != nil 
                print("Error getting documents: \(String(describing: error))")
             else 
                for document in (snapshot?.documents)! 
                    self.fireLatMin = document.data()["latMin"] as! Double
                    self.placeName = document.data()["placeName"] as! String
                    print("Fire latMin: ", self.fireLatMin)
                
            
    



func lonMaxRead() 
    let docRef = Firestore.firestore()
    docRef.collection("places")
        .whereField("lonMax", isGreaterThanOrEqualTo: lonNumberStore)
        .getDocuments  (snapshot, error) in
            if error != nil 
                print("Error getting documents: \(String(describing: error))")
             else 
                for document in (snapshot?.documents)! 
                    self.fireLonMax = document.data()["lonMax"] as! Double
                    self.placeName = document.data()["placeName"] as! String
                    print("Fire lonMax: ", self.fireLonMax)
                
            
    



func lonMinRead() 
    let docRef = Firestore.firestore()
    docRef.collection("places")
        .whereField("lonMin", isLessThanOrEqualTo: lonNumberStore)
        .getDocuments  (snapshot, error) in
            if error != nil 
                print("Error getting documents: \(String(describing: error))")
             else 
                for document in (snapshot?.documents)! 
                    self.fireLonMin = document.data()["lonMin"] as! Double
                    self.placeName = document.data()["placeName"] as! String

                    print("Fire lonMin : ", self.fireLonMin)
                
            
    


我觉得并且我非常有信心我做错了什么,无论是我的查询还是我的地名。

我的控制台和模拟器的结果:

Result from my console and my simulator

我认为where() 方法不会影响我的结果,但我不太确定。

【问题讨论】:

能否请您发布当前和预期的结果?哪种方法给出了错误的结果。 @TheTiger 我将结果添加为图像,我在两者中测试相同的位置,并以我在数据库中的名称显示两个不同的结果,我很确定这是问题所在我的“功能”不起作用。我期望的是从用户那里获取位置并在我的数据库中比较结果并显示结果,我不知道这是否有意义。 如果您将位置与某个半径范围内的位置进行比较,那么在这种情况下它将不起作用。您应该改用 Firebase GeoFire。 @TheTiger 我现在看到了,我正在阅读有关GeoFire 的信息,我看到它只适用于实时数据库。您是否知道是否有类似的东西可以与 Firestore 一起使用,或者我可能必须将我的数据移动到实时数据库中?感谢您的回复。 它正在进入 FireStore,但现在无法使用 FireStore。但是您可以做的只是将您的位置数据放入 Firebase 中,在过滤位置后,您可以再次在 FireStore 上查询更多数据。 【参考方案1】:

在这种情况下,如果您将位置与某个半径内的位置进行比较,它将不起作用。你应该改用Firebase GeoFire

GeoFire 正在处理 FireStore,一旦我和他们的人谈过话,但现在 FireStore 是不可能的。但是您可以做的只是将您的位置数据放入Firebase 中,过滤位置后您可以再次在FireStore 上查询更多数据。

您可以从GeoFire Doc、GeoFire Git 和GeoFire Blog 获得有关GeoFire 的帮助。

【讨论】:

以上是关于如何从 Firestore 访问和显示正确的字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何正确查询firestore数据库?

如何从 Firestore 文档中获取自定义对象的 ArrayList? [复制]

如何从firebase存储中获取图片,图片的网址在firestore中。

使用 Swift (Firestore) 访问特定文档字段

Vue、Vuex 和 Firestore:如何在前端显示检索到的 Firestore 数据并使其具有响应性?

如何格式化和显示从 AngularFire 返回的 Firestore 数据?