2016-10-14 5 views
0

Это может быть простой ответ, поэтому извиняйтесь заранее, но я застрял, потому что я все еще получаю голову, обернутую тем, как работает Firebase. Я хочу запросить базу данных Firebase на основе данных даты unix, которые там хранятся, а затем взять связанные данные «Уникальный идентификатор» и поместить их в массив.Convert Firebase Dictionary Data to Array (Swift)

Данные Firebase выглядит следующим образом:

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 

То, что я до сих пор выглядит следующим образом. Кажется, что часть запроса работает должным образом. Там, где я боюсь, как помещать данные «Уникальный идентификационный номер события» в массив. Это подход, который кажется самым близким к успеху, который основан на этом 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

Я в конечном итоге вновь работает, как я прочитал Firebase данные на основе подхода, изложенного в 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

Бинго, банго, бонго. Это snapshot.value не ребенок, дух. Благодаря! – Ben

+0

На самом деле, я говорил слишком рано. Это не работает, потому что я получаю ошибку «неоднозначное использование индекса» для строки «let unID =». Я попытался применить идеи из этого поста, но не был успешным. Есть идеи? http://stackoverflow.com/questions/36238507/ambiguous-use-of-subscript-error-after-new-swift-update – Ben

+0

Вы кодируете в быстром 2 или быстром 3? Для быстрого 2 используйте каждый.1 [Уникальный номер события ID], также я могу предположить, что не используйте интервалы в именах БД, вызывает ошибки. Измените его на ** Unique_ID_Event_Number ** – Dravidian