В настоящее время мы с командой пытаемся подключить нашу базу данных 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?

-1
hot-dog-123 10 Фев 2021 в 04:43

1 ответ

Лучший ответ

Это может помочь вам начать работу.

Рекомендуется оставлять данные в DataSnapshots как можно дольше - например, преобразование в словарь может усложнить работу.

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

Здесь используется .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

Др

0
Jay 10 Фев 2021 в 19:49