2016-10-05 60 views
4

我正在嘗試使用Firebase設置新項目,並且正在努力處理非關係數據庫和查詢系統。我已經閱讀了指南,尤其是那些關於數據結構的指南。 這是我的使用案例:我必須處理一些產品,每個產品都有一個名稱和一個家庭,這也是一個實體。 我已經創建了下面的結構,試圖遵循指導原則和示例。Firebase - iOS SDK - 按子值篩選

{ 
    "families" : [ { 
     "name" : "easy", 
     "products" : [ 10, 11 ] 
    }, { 
     "name" : "ir33", 
     "products" : [ 12, 13 ] 
    } ], 
    "products" : { 
     "10" : { 
      "family" : 0, 
      "name" : "Matita" 
     }, 
     "11" : { 
      "family" : 0, 
      "name" : "Penna" 
     }, 
     "12" : { 
      "family" : 1, 
      "name" : "Gomma" 
     } 
    } 
} 

給定一個家庭,我想選擇所有的產品。 我的第一個解決方案是訪問家庭,檢索ID數組,然後執行請求(每個ID一個)。它有效,但這種方法可能會導致大量的請求。 有沒有更好的方法來獲得?例如,我在這一個嘗試,但它不工作:

ref.child("products").queryOrderedByChild("family").queryEqualToValue("0", childKey: "family").observeSingleEventOfType(.Value, withBlock: { snap in 
    print("snap \(snap)") 
}) 

但它始終打印Snap (products) <null>

UPDATE

我可以用這個查詢訪問給定家族的產品:

ref.child("products").queryOrderedByChild("family").queryEqualToValue(0).observeSingleEventOfType 

順便說一句,現在我有這個警告,同時運行我的測試:

[ FirebaseDatabase]使用未指定的索引。考慮在/ products上添加「.indexOn」:「family」以獲得更好的性能

在此先感謝您的幫助!

+0

你可以嘗試從queryEqualToValue中的「0」中刪除引號嗎?我想現在你正在比較一個字符串和一個數字,這就是爲什麼你沒有得到任何結果。 –

+0

忽略它,它只是一個建議警告。 – Dravidian

+0

嗨@AndréKool,我已經試過了,但還不夠。我用新版本的查詢更新了我的答案。 – Zeb

回答

2

這裏是正確的解決方案,我在尋找解決過警告:

ref.child("products").queryOrderedByChild("family").queryEqualToValue(0).observeSingleEventOfType(.Value, withBlock: { snap in 
     print("snap \(snap)") 
     expectation.fulfill() 
    }) 

請看看@ronatory answer來處理警告

+0

更新了我對您的警告的回答 – ronatory

4

這個怎麼樣:

ref.queryOrderedByChild("family").queryEqualToValue(0).observeSingleEventOfType(.Value, with: { snap in 
    print("snap \(snap)") 
}) 

關於更新問題的更新:

添加到您的數據庫規則在火力控制檯(見截圖)。不要忘記點擊 「發佈」 按鈕:

"products": { 
    ".indexOn": "family" 
} 

enter image description here

+0

嗨ronatory,謝謝,但它不起作用 – Zeb

+1

好吧,也試過我的版本與報價「0」的等值? – ronatory

+0

是的,這是正確的,但還不夠。我更新了我的問題btw。 – Zeb