【发布时间】:2021-01-13 16:39:14
【问题描述】:
我创建了一个 decoadable 结构,用于解析存储在 firebase 中的数据。
struct DiscussionMessage: Decodable {
var message: String
var userCountryCode: String
var userCountryEmoji: String
var messageTimestamp: Double
var userName: String
var userEmailAddress: String
var fcmToken: String?
var question: String?
var recordingUrl: String?
}
我想使用这个结构来在 firebase 中存储数据。但我得到了错误:
*** 由于未捕获的异常“InvalidFirebaseData”而终止应用程序,原因:“(setValue:) 无法将 __SwiftValue 类型的对象存储在。只能存储 NSNumber、NSString、NSDictionary 和 NSArray 类型的对象。 以 NSException 类型的未捕获异常终止
当我这样存储数据时:
let message = DiscussionMessage(message: messageTextView.text, userCountryCode: userCountryCode, userCountryEmoji: userCountryEmoji, messageTimestamp: timestamp, userName: userName, userEmailAddress: userEmail, fcmToken: nil, question: nil, recordingUrl: nil)
messagesReference.childByAutoId().setValue(message)
有没有办法将可解码对象转换为字典,以便我可以将其存储在 firebase 中?
【问题讨论】:
-
你不能在 Firebase 实时数据库中存储 nil;没有值的节点不存在。我建议将结构更改为一个类,添加一个返回值的函数以写入字典 - 如果您确实需要节点存在,这也可以让您在 nil 的情况下存储默认值。
-
我添加了一个可能比方法更短的答案。我们在当前项目中成功使用它,但请告诉我它是否有效。
-
非常感谢!但我目前正在使用 Leo 的答案。它似乎更健壮。
标签: swift firebase firebase-realtime-database struct decodable