Как получить значения из объекта в Cloud Firestore? стриж - PullRequest
0 голосов
/ 31 августа 2018

Я довольно новичок в библиотеках Firestore и Firebase. Может кто-нибудь объяснить, как я могу получить поля из моего object и сохранить в переменной моего кода? Я пытаюсь получить доступ ко всем latMin, latMax, lonMin и lonMax из каждого объекта в моем Firestore, а также, если есть способ получить каждое поле с одинаковым именем (например, latMin с места 1 и 2). Я не знаю, возможно ли это или, может быть, есть лучший способ организовать мою Firebase.

Вот мой Cloud Firebase: Вот изображение моего Firestore, запрошенное в комментариях.

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 голосов
/ 01 сентября 2018

Я думаю, что ваша модель мест имеет ссылки на два объекта bestBuy и house. Таким образом, поисковый подход заключается в том, чтобы извлекать данные и сохранять их только в объекте. Означает, что вы можете напрямую установить все данные в модели plcaes. Затем вы можете вызывать методы-получатели bestBuy и house для получения данных по своему усмотрению. Вот код sampe (здесь он получает только один документ), но вы можете применить его ко всем документам, выполнив итерацию цикла 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")
    }
}

Но в соответствии с документацией по пожарному хранилищу лучший способ хранения вложенных объектов - это создать вложенную коллекцию и затем сохранить ее в своем документе.

0 голосов
/ 16 ноября 2018

Некоторые пояснения, поскольку документация iOS Firestore, IMO, проста во многих областях: есть два способа получить значения из поля документа (после получения документа) - с помощью метода 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() для поиска всех полей.

0 голосов
/ 31 августа 2018

Ваш код 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)
           }
       }
}

Проблема в исходном вопросе - структура базы данных. Вот структура, которая будет соответствовать коду в моем ответе и лучше подходит для того, что ОП хочет достичь.

Структура в вопросе имеет несколько мест, перечисленных в одной коллекции - это нормально, но она группирует места вместе. Если мы изменим это, чтобы иметь одно место на коллекцию, это сделает итерацию по ним и доступ к данным намного проще.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...