2016-10-14 37 views
0

這可能是一個簡單的答案,所以提前致歉,但我被卡住了,因爲我仍然在圍繞Firebase的工作方式進行頭部纏繞。我想根據保存在那裏的unix日期數據查詢Firebase數據庫,然後獲取相關的「唯一ID」數據並將其放入數組中。將Firebase字典數據轉換爲數組(Swift)

在火力地堡的數據是這樣的:

posts 
    node_0 
    Unix Date: Int 
    Unique ID Event Number: Int 
    node_1 
    Unix Date: Int 
    Unique ID Event Number: Int 
    node_2 
    Unix Date: Int 
    Unique ID Event Number: Int 

我至今如下。查詢部分似乎按預期工作。我在掙扎的地方是如何將「唯一ID事件號碼」數據放入數組中。這是基於這個post,似乎最接近成功的方法,但我得到一個錯誤,該孩子沒有「價值」的成員。

// Log user in 
     if let user = FIRAuth.auth()?.currentUser { 

      // values for vars sevenDaysAgo and oneDayAgo set here 

      ... 

      let uid = user.uid 

      //Query Database to get the places searched by the user between one and seven days ago. 
      let historyRef = self.ref.child("historyForFeedbackLoop/\(uid)") 
      historyRef.queryOrdered(byChild: "Unix Date").queryStarting(atValue: sevenDaysAgo).queryEnding(atValue: oneDayAgo).observeSingleEvent(of: .value, with: { snapshot in 

       if (snapshot.value is NSNull) { 
        print("error") 
       } 
       else { 

        for child in snapshot.children { 

         if let uniqueID = child.value["Unique ID Event Number"] as? Int { 

          arrayOfUserSearchHistoryIDs.append(uniqueID) 
         } 
        } 
       } 
      }) 
     } 
     else { 
      print("auth error") 
     } 

任何想法,非常感謝!

回答

1

我結束了再加工基礎上this post概述的方法我怎麼讀火力地堡數據。我使用的實際工作代碼如果對別人有幫助的話。

// Log user in 
if let user = FIRAuth.auth()?.currentUser { 

    let uid = user.uid 
    // values for vars sevenDaysAgo and oneDayAgo set here 

    ... 

    let historyRef = self.ref.child("historyForFeedbackLoop/\(uid)") 
    historyRef.queryOrdered(byChild: "Unix Date").queryStarting(atValue: sevenDaysAgo).queryEnding(atValue: oneDayAgo).observeSingleEvent(of: .value, with: { snapshot in 

     if (snapshot.value is NSNull) { 
      print("user data not found") 
     } 
     else { 

      for child in snapshot.children { 

       let data = child as! FIRDataSnapshot 
       let value = data.value! as! [String:Any] 
       self.arrayOfUserSearchHistoryIDs.append(value["Unique ID Event Number"] as! Int) 
      } 
     } 
    }) 
} 
4

嘗試使用這樣的: -

historyRef.queryOrdered(byChild: "Unix Date").queryStarting(atValue: sevenDaysAgo).queryEnding(atValue: oneDayAgo).observeSingleEvent(of: .value, with: { snapshot in 

     if let snapDict = snapshot.value as? [String:AnyObject]{ 

       for each in snapDict{ 

         let unID = each.value["Unique ID Event Number"] as! Int 
         arrayOfUserSearchHistoryIDs.append(unID) 
        } 

       }else{ 
       print("SnapDict is null") 
      } 

     }) 
+0

賓果,邦戈,邦戈。這是快照。值不是孩子,杜。謝謝! – Ben

+0

其實,我說得太快了。這不起作用,因爲我得到了「let unID =」行的「模糊使用下標」的錯誤。我嘗試應用這篇文章的想法,但並未成功。有任何想法嗎? http://stackoverflow.com/questions/36238507/ambiguous-use-of-subscript-error-after-new-swift-update – Ben

+0

你是用swift 2還是swift 3編碼?對於swift 2,請使用each.1 [唯一ID事件號],也可以建議不要在數據庫名稱中使用間距,導致錯誤。將其更改爲** Unique_ID_Event_Number ** – Dravidian