ios - 带有 Firebase 数据库或 Firestore 读/写的 Swift 4

标签 ios swift firebase google-cloud-firestore

我在 iOS 开发方面还很陌生,对数据库集成也很陌生。简而言之,我正在尝试创建一个水跟踪器。在实时数据库和 Firestore 中,我都可以写入新数据和更新数据。当我关闭并重新打开应用程序时,控制台会打印当前存储的值。我正在努力将这种值(value)融入标签中。我的字典已设置(例如)["Cups of Water:"x],我想将 x 的值放入标签中,但我似乎无法将该值拉入。

我似乎无法克服的另一个问题是附加数据库存储的内容,而不是完全覆盖。当我关闭/重新打开应用程序时,控制台打印“15”(例如),排除我无法将值导入标签的问题,如果我触摸添加杯子按钮,它将覆盖“15”的值现在显示“1”。

这显然是我没有正确添加的东西,我对问题所在有一些想法,但我不太明白。非常感谢任何输入!

以下代码特定于 Firestore。我可以在实时数据库中获得类似的过程(通过使用正确的语法)。 代码:

@IBOutlet weak var totalWaterLabel: UILabel!

var ref: DocumentReference? = nil
var variableCupsOfWater = 0
var handle: AuthStateDidChangeListenerHandle?
var waterListener: FIRListenerRegistration!

override func viewDidLoad() {
    super.viewDidLoad()

}

@IBAction func addOnePressed(_ sender: UIButton) {
    variableCupsOfWater += 1
    totalWaterLabel.text = String(variableCupsOfWater)
    saveToFirestore()
}
@IBAction func addTwoPressed(_ sender: Any) {
    variableCupsOfWater += 2
    totalWaterLabel.text = String(variableCupsOfWater)
    saveToFirestore()
}
@IBAction func addFourPressed(_ sender: UIButton) {
    variableCupsOfWater += 4
    totalWaterLabel.text = String(variableCupsOfWater)
    saveToFirestore()
}

func saveToFirestore() {
    let _: DocumentReference? = nil
    let db = Firestore.firestore()
    let user = Auth.auth().currentUser
    let uid = user!.uid

    db.collection("By User").document("\(uid)").updateData([
        "Cups Of Water": "\(totalWaterLabel.text!)",
        "Date": NSDate()
    ]) { err in
        if let err = err {
            print("Error adding document: \(err)")
        } else {
            print("Document added")
        }
    }
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    handle = Auth.auth().addStateDidChangeListener({ (auth, user) in
        print(Auth.auth().currentUser as Any)
    })
    let db = Firestore.firestore()
    let user = Auth.auth().currentUser
    let uid = user!.uid


    db.collection("By User").document("\(uid)")
        .addSnapshotListener { querySnapshot, error in
                    guard let querySnapshot = querySnapshot, querySnapshot.exists else {return}
            let myData = querySnapshot.data()
            let currentWaterTotal = myData["Cups of Water:"] as? String ?? ""
            let combinedCups = ("\(currentWaterTotal)") + self.totalWaterLabel.text!
            self.totalWaterLabel.text = "\(querySnapshot.data())"
            if let error = error {
                print("Error retreiving collection: \(error)")
            }else{

                print("Current data: \(String(describing: querySnapshot.data()))")
            }
        }

最佳答案

首先你必须完全匹配 key 所以我认为你应该试试这个:

myData["Cups Of Water"] 

代替

myData["Cups of Water:"]

使用它来安全地从可选的值中解包:

if let cupsOfWater = myData["Cups Of Water"] as? String { 

          self.totalWaterLabel.text = cupsOfWater 

}

这叫做optional binding语法,你可以在这里了解更多

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html

关于ios - 带有 Firebase 数据库或 Firestore 读/写的 Swift 4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46621406/

相关文章:

ios - 使用文档选择器从 iCloud 中选择一个文件夹

python - (401) 未经 python-firebase 授权

android - Firebase 数据库引用初始化使应用程序崩溃

javascript - 排毒文本输入不写文本

ios - Swift:使用自定义字体从 HTML 创建字符串

ios - 在其他 Controller 的 View 中添加页面 Controller View 时出错

ios - 在不同 CollectionViewCell 之间传递数据

ios - 使用 Swift 2.1 在 iOS 中播放两种声音

iOS safeAreaLayoutGuide 为 iPhone X 提供完整的 812 高度

swift - 水平滚动以在 Swift 中显示 PDF