如何使用struct更新Firebase

时间:2016-10-23 03:26:35

标签: ios swift firebase firebase-realtime-database

我有一个结构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不是字符串吗?或者我缺少什么,如何在不创建NSMutableDictionary的情况下使用我的模型将值保存到Firebase中?非常感谢帮助。

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

的理想值

2 个答案:

答案 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() )

这会导致节点写入Firebase,如下所示

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

答案 1 :(得分:1)

不,它与您尝试在Firebase数据库中保存的密钥类型无关,只是struct 是一个dataModel,或者准确地说是一个物理分组的列表您使用某些自定义数据初始化的变量 ,并且您只能在Firebase数据库中保存四种类型的值类型: -

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

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

因此,当您在 NSMutableDictionary 中转换值时,您会清除struct。 Firebase数据库无法识别结构和类。