2016-10-23 27 views
0
更新Firebase

我有一個struct EventDate,並且正在嘗試更新Firebase中的引用。如何使用結構

struct EventDate { 

    var club: String = "" 
    var date: String = "" 
    var eventText: String = "" 
    var free: String = "" 
    var monthYear: String = "" 
} 

我的更新函數拋出lldb。我猜是因爲keys沒有字符串(?)

func updateEvent(_ backendlessUserObjectID: String, event: EventDate) { 

    let reference = firebase.child("eventDates").child(backendlessUserObjectID).child(event.date) 
    reference.setValue(event) { (error, ref) -> Void in 
     if error != nil { 
      print("\(error)") 
     } 
    } // lldb here 
} 

如果我改變功能,下面,一切都很好(因爲KeysValues現在字符串?)

func updateEvent(_ backendlessUserObjectID: String, event: EventDate) { 

    let item: NSMutableDictionary = ["club" : event.club, 
            "date" : event.date, 
            "eventText" : event.eventText, 
            "free" : event.free, 
            "monthYear" : event.monthYear] 

    let reference = firebase.child("eventDates").child(backendlessUserObjectID).child(event.date) 
    reference.setValue(item) { (error, ref) -> Void in 
     if error != nil { 
      print("\(error)") 
     } 
    } 
} 

我說得對不對我收到lldb,因爲我的模型中的keys不是字符串?或者我錯過了什麼,以及如何使用我的模型將值保存到我的Firebase中,而不創建NSMutableDictionary?非常感謝幫助。

PS:print(event.date) = 201610120200000000 - >所需值.child

+0

你確定你正在使用你的第二個代碼塊的'event.date'? – Dravidian

+0

你的意思是'.child'?是。因爲它是'yyyyMMddhhmmssSSSS'的一個已知字符串 –

+0

或者你是什麼意思?我也打印了它,它是所需的值 –

回答

1

沒有它無關,與你試圖在你的火力地堡數據庫來保存鍵的類型它只是struct是一個數據模型或者是精確的,你有一些自定義的數據初始化變量物理分組列表,您只能保存四種類型的值類型的你火力地堡數據庫: -

  • 的NSDictionary
  • 的NSArray
  • 的NSNumber
  • 的NSString

查找文檔: - Read And Write data, Firebase- iOS

所以,當你在NSMutableDictionary中施放你的值時,你會清除結構。而且,Firebase數據庫不支持struct和class。

+0

非常感謝你的解釋 –

2

Firebase數據以JSON格式存在,可以將其視爲鍵值對。鍵必須是字符串,並且值可以是Dravidians答案中提到的任何數據類型(這是正確的答案,應該被接受)。我想補充一些可能有所幫助的附加評論。

有時您想要在代碼中使用結構並且無法直接寫入Firebase - 您需要某種方式將數據從結構中提取到Firebase所喜歡的內容 - 這是一個字典。

繼承人一個例子(Swift 3,Firebase 2。X)

struct EventDate { 
    var club: String = "" 
    var date: String = "" 
    var eventText: String = "" 
    var free: String = "" 
    var monthYear: String = "" 

    func getDict() -> [String:String] { 
      let dict = ["club": self.club, 
         "date": self.date, 
         "eventText": self.eventText, 
         "free": self.free, 
         "monthYear": self.monthYear 
         ] 

      return dict 
    } 
} 


var event = EventDate() 
event.club = "Wimbledon" 
event.date = "20161023" 
event.eventText = "Special Tennis Event" 
event.free = "Free" 
event.monthYear = "10/2016" 

let ref = self.myRootRef.child(byAppendingPath: "events")! 
let eventRef = ref.childByAutoId() //Firebase 2.x 

eventRef?.setValue(event.getDict()) 

這導致被寫入到火力地堡一個節點,看起來像這樣

"events" : { 
    "-KUli8oiM_KKw8GZ0MMm" : { 
     "club" : "Wimbeldon", 
     "date" : "20161023", 
     "eventText" : "Special Tennis Event", 
     "free" : "Free", 
     "monthYear" : "10/2016" 
    } 
} 
+0

這是一個非常好的答案。 1)你向我解釋了2)你提供了一個代碼示例來幫助我3)你放鬆了接受誰的答案的決定。 upvote爲你,我希望你會收到進一步upvotes。謝謝 –