【问题标题】:Firebase Read and Save Data Issues (Swift)Firebase 读取和保存数据问题 (Swift)
【发布时间】:2021-02-10 01:43:54
【问题描述】:

我和一个团队目前正在尝试将我们的实时 firebase 数据库连接到我们的 swift/iOS XCode 项目。我们正在努力读取当前数据库中的数据,并希望有人能解答我们的问题。

refFoods = Database.database().reference().child("food");
        
refFoods.observeSingleEvent(of: .value, with: { ( snapshot ) in
    // Get user value
    let value = snapshot.value as? NSDictionary
    let foodName = value?["arborGrill/foodName"] as? String ?? "failed foodName"
    // let value = snapshot.value as? [String: AnyObject]
    //            let foodName = value?["foodName"] as? String ?? ""
    
    // print(value ?? "failed1")
    print(foodName)
    // ...

    
    // print(self.food)
  })

代码应该从中提取的数据库:

我们尝试创建一个包含食物值的结构:

struct Foods {
    var foodName:String
    var ratingAvg:Int
    var reviewStrings:Array = [""]
}

并尝试使用 Firestore 等变通方法来使其正常工作,但均无济于事。是否需要对数据库进行不同的格式化,还是我们的 Swift 代码有问题?

【问题讨论】:

  • 您分享的代码有什么问题?请注意,如果您坚持使用单个 sn-p,而不是与您尝试过的变体共享多个 sn-p,那么最容易提供帮助。
  • @FrankvanPuffelen 问题是使用 swift 保存存储在 'let value' 中的值。
  • 那么print(foodName) 打印了什么?如果在调试器中检查value,它的值是多少?
  • 请在 let value = snapshot.value as 之后转储(value)? NSDictionary,看看你得到了什么我

标签: ios swift firebase firebase-realtime-database swiftui


【解决方案1】:

这可能有助于您继续前进。

最好将数据尽可能长时间地保留在 DataSnapshots 中 - 例如转换为 Dictionary 会使其处理起来更加复杂。

此外,排序也很重要,因此您可以看到第一步是获取子节点并将它们转换为数组以保持顺序

.observeSingleEvent 在这里被使用,因为我只阅读一次食物,没有留下观察者未来的变化。

func readAllFoods() {
    let ref = self.ref.child("foods") //self.ref points to MY firebase.
    ref.observeSingleEvent(of: .value, with: { snapshot in
        let allRestaurantsSnap = snapshot.children.allObjects as! [DataSnapshot] //contains all child nodes of food
        for foodSnap in allRestaurantsSnap { //iterate over each restaurant node
            let restaurantName = foodSnap.key //arborGrill, burgerKing etc
            let foodName = foodSnap.childSnapshot(forPath: "foodName").value as? String ?? "No food name"
            print(foodName)
        }
    })
}

我还将劝阻您不要在 NoSQL 数据库中使用数组。它们可能非常有限并且难以使用,就像您需要更改数组一样,必须将其读入、更改、删​​除和写回。

所以不是这个

reviewString
  0: Some Review
  1: Another Review

这样做

reviews
   -9as99idjk4ii9jas09 //created with childByAutoId
      review: "Awesome restaurant"
      by_user: "uid_1234"
      date: 20210131
   -ajsijo9fj9dkkfg00d
      review: "Top notch cuizine"
      by_user: "uid_5678"
      date: 20210210

【讨论】:

  • 非常感谢!这成功了。
  • @hot-dog-123 太好了!我很高兴它有所帮助。请务必接受它,以便它可以帮助他人。 How to accept
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多