2017-09-24 5 views
1

私は、ノードの1つの以上のレベルを持っており、それを介して取得することはできませんノードから結果を取得しようとしています:Firebaseルーピングマルチレベルのノード

私はこのようなデータを取得しています、それはノードのために完璧ではなく動作します( ) "アイテム" と呼ばれる:

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" とユーザーIDを知っているとき

"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" 
     }, 

は、私はそれをどのように行うのですか。私はちょうどapropiate細胞でそれらをリストしたいと思う。

答えて

1

私の提案です。

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

ありすぎノードであり、階層のこの種は、我々は非正規化と呼ぶものを尊重しない:データベースの構造に見

まず、あなたは現在、このようなものを持っています。 FirebaseデータベースはNoSQLデータベースのようなものであり、SQLの古典的なデータベースに比べて大きな違いがあることに注意してください。ここでは、データベースの構造を非正規化するためのベストプラクティスの説明です:

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... 

次に、あなたのコードでは、次のことができます:私が提案することができますどのようなStructure your database

は、より多くのこのようなあなたのデータベースを構築である

  1. はすべてbreakfeast IDS UsersFoodノード上の単一のイベントに守って
  2. その後、すべてbreakfeast IDがitems_idを取得して
  3. 最後にitems_idデータを取得する

あなたのコードを理解するのに役立ちます。

編集1:あなたはこれを使用して、子ノードを介してもループすることができます

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

をありがとう!私は非正規化について知っています、私はあなたのように私のデータを構造化しています。この場合、ノードから直接データを取得する必要があります。私はそれが方法でなければならないと確信していますが、私はそれを理解することができず、私は今ここで2日間立ち往生しています。このような場合に "forループのように"使う方法を知っていますか? –

+0

私はforループを目的に編集します。 – Arrabidas92

+0

ありがとうございます!私のコードでこれを使って "items"をループして値を取得するにはどうすればいいですか? –

関連する問題