Firebase循环多级节点

时间:2017-09-24 11:14:01

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

我试图从一个节点获得结果,该节点有一个更多级别的节点但无法通过它:

我正在检索这样的数据(它工作得很好但不适用于名为“items”的节点):

func fetchMeals() {
    print("start pulling data")

    let user = Auth.auth().currentUser?.uid

    ref.child("Users_Food_Data").child(user!).queryOrderedByKey().observeSingleEvent(of: .value, with: { snapshot in

        if snapshot.value as? [String : AnyObject] != nil {

            let allMeals = snapshot.value as! [String : AnyObject]
            self.foodArray.removeAll()

            for (_, value) in allMeals {

                let foodToShow = FoodStruct()


                if let calories = value["calories"] as? String,
                    let itemCarbs = value["energy"] as? String,
                    let itemProteins = value["proteins"] as? String,
                    let itemFat = value["fat"] as? String,
                    let date = value["date"] as? String,
                    let id = value["id"] as? String,
                    let name = value["name"] as? String,
                    let interval = value["interval"] as? Int {
                    foodToShow.itemKcal = calories
                    foodToShow.itemCarbs = itemCarbs
                    foodToShow.itemProteins = itemProteins
                    foodToShow.itemFat = itemFat
                    foodToShow.id = id
                    foodToShow.interval = interval
                    foodToShow.date = date
                    foodToShow.itemName = name



                    self.foodArray.append(foodToShow)
                    self.collectionView?.reloadData()
                }

                self.breakfastArray.sort(by: {$0.interval! > $1.interval!})



            }
        }

        })
}

数据库看起来像这样:

"Users_Food_Data" : {
"JztkBihGgda0jtSpe6pNwt8hZu13" : {
  "Breakfast:23 Sep 2017" : {
    "calories" : "1145.0",
    "date" : "23 Sep 2017",
    "energy" : "238.8",
    "fat" : "3.0",
    "id" : "-Kukx_9lSpCh3lcEMzap",
    "interval" : 1.506207565807117E9,
    "items" : {
      "-KukxKAntXDaS__v3ZLA" : {
        "calories" : "30",
        "date" : "23 Sep 2017",
        "energy" : "6",
        "fat" : "0.1",
        "interval" : 1.506207500336909E9,
        "itemKey" : "-KukxKAntXDaS__v3ZLA",
        "mealKey" : "-KukxKAntXDaS__v3ZLB",
        "name" : "Strawberries",
        "proteins" : "0.8",
        "quantity" : "3"
      },
      "-KukxLYmyg32lU1D3Wh3" : {
        "calories" : "29",
        "date" : "23 Sep 2017",
        "energy" : "9",
        "fat" : "0.5",
        "interval" : 1.506207505968336E9,
        "itemKey" : "-KukxLYmyg32lU1D3Wh3",
        "mealKey" : "-KukxLYmyg32lU1D3Wh4",
        "name" : "Lemon",
        "proteins" : "1.1",
        "quantity" : "1"
      }
    },
    "name" : "Breakfast",
    "proteins" : "17.0"
  },
  "Breakfast:24 Sep 2017" : {
    "calories" : "959.0",
    "date" : "24 Sep 2017",
    "energy" : "106.4",
    "fat" : "46.1",
    "id" : "-KunWOZeSxW9eCIA6O1z",
    "interval" : 1.506250519537633E9,
    "items" : {
      "-KulrJq6jOpsG6oiJuDM" : {
        "calories" : "458",
        "date" : "24 Sep 2017",
        "energy" : "4.6",
        "fat" : "45",
        "interval" : 1.506222704055992E9,
        "itemKey" : "-KulrJq6jOpsG6oiJuDM",
        "mealKey" : "-KulrJq6jOpsG6oiJuDN",
        "name" : "Coconut",
        "proteins" : "4",
        "quantity" : "1"
      },

当我只知道“Users_Food_Data”和用户ID时,我该怎么做。我只是想在apropiate细胞中列出它们。

1 个答案:

答案 0 :(得分:1)

这是我的建议。

首先查看您的数据库结构,您目前有类似的内容:

Users_Food_Data
|_userid
  |_FoodStruct
    |_items
      |_id_1
        |_data like calories, date...
      |_id_2
        |_data...

节点太多,这种层次结构不符合我们所谓的 Denormalization。请记住,Firebase数据库就像NoSQL数据库,与SQL经典数据库相比,它有很大的不同。以下是对数据库结构进行非规范化的最佳实践的解释:Structure your database

我可以建议更像这样的数据库结构:

One node :
UsersFood
|_userid
  |_breakfeast_id_1
  |_breakfeast_id_2...

2nd node
Breakfeasts
|_breakfeast_id_1
  |_item_id_1
  |_item_id_2...

3rd node
Items
|_item_id_1
  |_calories
  |_date
  |_energy...

然后在您的代码中,您可以:

  1. 使用UsersFood节点上的单个事件观察所有breakfeast ID
  2. 然后使用所有breakfeast ID获取items_id
  3. 最后获取items_id数据
  4. 希望它能帮助您完成代码。

    编辑1:您还可以使用以下方法遍历子节点:

    for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
         //DO WHAT YOU NEED TO DO
    }