Как получить доступ к значению поля Firestore, не зная имени? - PullRequest
0 голосов
/ 05 мая 2019

Я загружаю данные в Firestore следующим образом:

 func uploadTrackedSymptomValues(symptom: String, comment: String, time: String, timestamp: Int) {
    print("Uploading symptom values.")
    let user_id = FirebaseManager.shared.user_id
    let docRef = db.collection("users").document(user_id!).collection("symptom_data").document("\(symptom)_data")

    let updateData = [String(timestamp) : ["symptom" : symptom, "severity" : severity, "comment" : comment, "timestamp" : String(timestamp)]]
    docRef.setData(updateData, merge: true)
    docRef.setData(updateData, merge: true) { (err) in
        if err != nil {
            print(err?.localizedDescription as Any)
            self.view.makeToast(err?.localizedDescription as! String)
        } else {
            print("Symptom Data Uploaded")
            self.view.makeToast("\(symptom) logged at \(time). Severity: \(self.severity). Comment: \(comment)", duration: 2.0, position: .center, title: "Success!", image: self.cellImage) { didTap in
                if didTap {
                    print("completion from tap")
                } else {
                    print("completion without tap")
                }
            }
        }
    }
}

На Firestore это выглядит так: enter image description here

Теперь я хочу использовать каждое поле вотметка времени для UITableViewCell Но я не уверен, как получить доступ к полю под документом, например, 1556998898 в Anxiety_data, поэтому я могу получить доступ к:

 comment = "comment";
 severity = "Mild";
 symptom = "Anxiety";
 timestamp = 1556998898;

Для использования в UITableViewCell, С базой данных в реальном времени я бы использовал childAdded listener.Я пытался:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let index = indexPath.row
    let cell = tableView.dequeueReusableCell(withIdentifier: "EntryDataCell", for: indexPath) as! EntryDataCell
    cell.configureCustomCell()

    let user_id = FirebaseManager.shared.user_id
    let symptomRef = db.collection("users").document(user_id!).collection("symptom_data").document(symptomSections[index])
    symptomRef.getDocument(completion: { (document, err) in
        if let document = document, document.exists {
            let dataDescription = document.data().map(String.init(describing:)) ?? "nil"
            print("\(document.documentID) : \(dataDescription)")
            cell.commentLabel.text = dataDescription //<- Stuck here

        } else {
            print("Document does not exist")
        }
    })

    return cell
}

Но я застрял в том, как бы получить конкретное поле, так как я не знаю имени, так как это временная метка, когда оно было сделано, а не весьдокумент.Если есть лучший способ справиться с этим, пожалуйста, дайте мне знать.Спасибо.

РЕДАКТИРОВАТЬ:

Я могу получить ключ (метка времени) и значения, но у меня возникают проблемы при синтаксическом анализе значений:

 let obj = dataDescription
            for (key, value) in obj! {
                print("Property: \"\(key as String)\"") //<- prints Timestamp
                print("Value: \"\(value)\"") // <- prints the comment,severity,symptom,timestamp fields I need.
            }

Если я пытаюсьdo cell.titleLabel.text = value["comment"] Я получаю Value of type 'Any' has no subscripts

Я думал об использовании структуры:

   struct FieldValues: Codable {
let comment: String
let severity: String
let symptom: String
let timestamp: Int
 }

Но я не уверен, как использовать ее с value.Я чувствую, что нахожусь немного над моей головой для этой последней части.

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