火力地堡循环多级节点

问题描述:

我试图让从具有节点多一个层次,并通过它不能得到一个节点的结果:火力地堡循环多级节点

我检索这样的数据(它完美,但不是为节点所谓的 “项目”):

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细胞中。

这是我的建议。

首先看你的数据库结构,你现在有这样的事情:

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

有太多的节点,这种层次的不尊重我们所说非规范化。请记住,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 IDS
  2. 然后用所有breakfeast IDS得到items_id
  3. 终于得到items_id数据

希望它能帮助你通过你的代码。

编辑1:您还可以遍历子节点通过使用这样的:

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

谢谢!我知道非规范化,我像你说的那样构建我的数据。在这种情况下,我必须直接从节点获取数据。我非常肯定这肯定是一种方式,但我无法弄清楚,现在我在这里呆了两天。你知道任何方式“像循环”如何在这种情况下使用它? –

+0

好的。我编辑我的帖子旨在为循环。 – Arrabidas92

+0

谢谢!我如何在我的代码中使用它来循环“项目”并获得它们的值? –