【问题标题】:Getting Invalid Firebase Data error when trying to save to Firebase using Swift尝试使用 Swift 保存到 Firebase 时出现无效的 Firebase 数据错误
【发布时间】:2020-03-12 02:31:27
【问题描述】:

目标:将饮品订单保存到 Firebase

问题:将 [Drink] 数组转换为字典

我收到以下错误消息:

错误:'InvalidFirebaseData',原因:'(setValue:withCompletionBlock:) 无法在drinksOrdered.0009373 中存储vipeeps.Drink 类型的对象。 只能存储 NSNumber、NSString、NSDictionary 和 NSArray。'

func saveDrinkOrder(orderRef: String, venueName: String, drinksOrder: [Drink], chargeId: String, chargeObject: [String: Any], handler: @escaping(Bool) -> ()){

        guard let uid = Auth.auth().currentUser?.uid else { return }

        let orderNo = orderRef

        let timeStamp = Date().timeIntervalSince1970

        let drinksOrdered = Dictionary(uniqueKeysWithValues: drinksOrder.map {($0.posId, $0.self)}) //<---issue here: $0.self if still a Drink object

        let venue = venueName

        let stripeChargeResponse = chargeObject

        let ref = REF_DRINK_ORDERS.child(uid).child(orderNo)


        //message node values
        let values = [
            "dateOrdered": timeStamp,
            "venueName": venue,
            "timeStamp": Date().timeIntervalSince1970,
            "drinksOrdered": drinksOrdered,
            "stripeResponse": stripeChargeResponse] as [String : Any]

        ref.setValue(values) { (error, dbRef) in

            if error != nil {
                print(error!.localizedDescription)
                handler(false)
                return
            }

            handler(true)

        }//end setValue

    }//end func

asdf

class Drink {

    var posId: String?
    var name: String?
    var description: String?
    var tags: [String]?
    var unitPrice: String?

    init(dictionary: [String: Any]) {

        self.posId = dictionary["posId"] as? String
        self.name = dictionary["name"] as? String
        self.description = dictionary["description"] as? String
        self.unitPrice = dictionary["unitPrice"] as? String
        self.tags = dictionary["tags"] as? [String]


    }//end init

}//end class

【问题讨论】:

  • 看看这里给出的答案:https://stackoverflow.com/questions/55750619/how-to-store-custom-object-in-firebase-with-swift。我会建议同样的事情,将您的 Drink 对象的基本数据保存到字典中。可以按照@Jay 在他的评论中建议的方式在 Firebase 中保存和加载对象。
  • 当我有一组[Drink] 时,这很不方便,如果我只处理一个对象,那么是的,你的建议是有意义的。

标签: swift dictionary firebase-realtime-database


【解决方案1】:

我想通了,可能不是最有效的方法,但它有效:

  1. 我更新了我的 Drink 类以将对象作为 Dictionary[String:Any] 返回

    var asDictionary : [String:Any] { 让镜子=镜子(反射:自我) 让 dict = Dictionary(uniqueKeysWithValues: mirror.children.lazy.map({ (label:String?, value:Any) -> (String, Any)? in 守卫让标签=标签其他{返回零} 返回(标签,值) }).compactMap { $0 }) 返回字典 }

  2. 遍历 [Drinks] 数组以创建字典到 Firebase

    var DrinkDict = String:Any

        for drink in drinksOrder {
            drinksDict[drink.posId!] = drink.asDictionary
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-23
    • 2017-05-24
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-24
    相关资源
    最近更新 更多