InvalidFirebaseData Swift 3 只能存储 NSNumber、NSString、NSDictionary 和 NSArray 类型的对象。



我正在尝试将 Firebase 集成到我的应用中,并希望以以下格式存储数据。

"chits": {
"Chit-1": {
  "Bidders": [
    {
      "bankAccNumber": "5555566966",
      "bankIFSC": "GFHJJHHJ",
      "bankName": "55666",
      "bidderEmail": "desi@venkat.co.in",
      "bidderId": "Bidder-1",
      "bidderName": "Venkat Desi",
      "bidderPhone": "9999999999",
      "checked": false,
      "paymentType": 66555
    },
    {
      "bankAccNumber": "5555566966",
      "bankIFSC": "GFHJJHHJ",
      "bankName": "55666",
      "bidderEmail": "desi@venkat.co.in",
      "bidderId": "Bidder-2",
      "bidderName": "Venkat Desi",
      "bidderPhone": "9999999999",
      "checked": false,
      "paymentType": 66555
    },
    {
      "bankAccNumber": "5555566966",
      "bankIFSC": "GFHJJHHJ",
      "bankName": "55666",
      "bidderEmail": "desi@venkat.co.in",
      "bidderId": "Bidder-3",
      "bidderName": "Venkat Desi",
      "bidderPhone": "9999999999",
      "checked": false,
      "paymentType": 66555
    }
  ],
  "chitId": "Chit-1",
  "chitName": "ABC1",
  "chitTotalValue": 240000,
  "endDate": "11/10/2018",
  "monthlyShare": 1000,
  "startDate": "11/10/2017",
  "totalMonths": 12
},
"Chit-2": {
  "bidderIds": [
    {
      "bidderId": "0",
      "bidderName": "Rajesh Challuri",
      "bidderPhone": "3333333333",
      "checked": true,
      "paymentType": 0
    },
    {
      "bidderId": "0",
      "bidderName": "Govinda Bhonsle",
      "bidderPhone": "9999999999",
      "checked": true,
      "paymentType": 0
    }
  ],
  "chitId": "Chit-2",
  "chitName": "ABC2",
  "chitTotalValue": 100000,
  "endDate": "12/10/2018",
  "monthlyShare": 8000,
  "startDate": "12/10/2017",
  "totalMonths": 12
},
"Chit-3": {
  "bidderIds": [
    {
      "bidderId": "0",
      "bidderName": "Rajesh Challuri",
      "bidderPhone": "3333333333",
      "checked": true,
      "paymentType": 0
    },
    {
      "bidderId": "0",
      "bidderName": "Govinda Bhonsle",
      "bidderPhone": "9999999999",
      "checked": true,
      "paymentType": 0
    }
  ],
  "chitId": "Chit-3",
  "chitName": "ABC3",
  "chitTotalValue": 200000,
  "endDate": "13/10/2018",
  "monthlyShare": 2000,
  "startDate": "13/10/2017",
  "totalMonths": 12
}}}

我成功地存储了投标人的数据,包括姓名,电子邮件,电话,帐户详细信息等。但是,我还需要存储Chit数据。下面是这两个类的代码。

投标人.swift

class Bidder {
let bidderId: Int
let bidderName: String
let bidderEmail: String
let bidderPhone : String
let modeOfPayment: Int
let bidderBankName: String
let bidderBankAcno: String
let bidderIfscCode: String
let paymentArray :  [[String:String]]?
let chitrefArray : [String]?
let ref: FIRDatabaseReference?
init(bidderId: Int, bidderName: String,bidderEmail: String, bidderPhone: String, modeOfPayment: Int, bidderBankName: String, bidderBankAcno: String, bidderIfscCode: String,paymentArray:  [[String:String]], chitrefArray: [String]) {
    self.bidderId = bidderId
    self.bidderName = bidderName
    self.bidderEmail = bidderEmail
    self.bidderPhone = bidderPhone
    self.modeOfPayment = modeOfPayment
    self.bidderBankName = bidderBankName
    self.bidderBankAcno = bidderBankAcno
    self.bidderIfscCode = bidderIfscCode
    self.paymentArray = paymentArray
    self.chitrefArray = chitrefArray
    self.ref = nil
}
init(snapshot: FIRDataSnapshot) {
    let snapshotValue = snapshot.value as! [String: AnyObject]
    bidderId = snapshotValue["bidderId"] as! Int
    bidderName = snapshotValue["bidderName"] as! String
    bidderEmail = snapshotValue["bidderEmail"] as! String
    bidderPhone = snapshotValue["bidderPhone"] as! String
    modeOfPayment = snapshotValue["modeOfPayment"] as! Int
    bidderBankName = snapshotValue["bidderBankName"] as! String
    bidderBankAcno = snapshotValue["bidderBankAcno"] as! String
    bidderIfscCode = snapshotValue["bidderIfscCode"] as! String
    paymentArray = snapshotValue["paymentArray"] as? [[String:String]]
    chitrefArray = snapshotValue["chitrefArray"] as? [String]
    ref = snapshot.ref
}
func toAnyObject() -> Any {
    return [
        "bidderId" : bidderId,
        "bidderName" : bidderName,
        "bidderEmail": bidderEmail,
        "bidderPhone": bidderPhone,
        "modeOfPayment": modeOfPayment,
        "bidderBankName":bidderBankName,
        "bidderBankAcno": bidderBankAcno,
        "bidderIfscCode":bidderIfscCode,
        "paymentArray": paymentArray!,
        "chitrefArray" : chitrefArray!
    ]
}}

奇特.swift

struct ChitObject {
var chitId : Int
var chitName: String
var startDate: String
var endDate : String
var chitTotalAmt: Int
var chitTotalMonths: Int
var bidders: [Bidder]
var ref: FIRDatabaseReference?
init(chitId: Int,chitName: String, startDate: String, endDate: String, chitTotalAmt: Int, chitTotalMonths: Int, bidders: [Bidder]) {
    self.chitId = chitId
    self.chitName = chitName
    self.startDate = startDate
    self.endDate = endDate
    self.chitTotalAmt = chitTotalAmt
    self.chitTotalMonths = chitTotalMonths
    self.bidders = bidders 
    self.ref = nil
}
init(snapshot: FIRDataSnapshot) {
    let snapshotValue = snapshot.value as! [String: Any]
    chitId = snapshotValue["chitId"] as! Int
    chitName = snapshotValue["chitName"] as! String
    startDate = snapshotValue["startDate"] as! String
    endDate = snapshotValue["endDate"] as! String
    chitTotalAmt = snapshotValue["chitTotalAmt"] as! Int
    chitTotalMonths = snapshotValue["chitTotalMonths"] as! Int
    bidders = snapshotValue["bidders"] as! [Bidder]
    ref = snapshot.ref
}
func toAnyObject() -> Dictionary<String, Any>
{
    return [
        "chitId" : chitId,
        "chitName": chitName,
        "startDate": startDate,
        "endDate": endDate,
        "chitTotalAmt":chitTotalAmt,
        "chitTotalMonths": chitTotalMonths,
        "bidders":bidders
    ] 
}}

视图控制器.swift

let chitItem = ChitObject(chitId: self.chitId, chitName: chitName.text!, startDate: startDate.text!, endDate: endDate.text!, chitTotalAmt: Int(totalAmount.text!)!, chitTotalMonths:
            Int(totalMonths.text!)!, bidders: biddersArray)
        let chitItemRef = ChitUtils.chitRef.child((chitName.text?.lowercased())!) // Crashes here at this point. 
        chitItemRef.setValue(chitItem.toAnyObject(), withCompletionBlock: { erorr , dataRef in
            if erorr != nil
            {
                let _ = self.navigationController?.popViewController(animated: true)
            }
        })
        chitItemRef.setValue(chitItem.toAnyObject())

输出: 由于未捕获的异常"无效FirebaseData"而终止应用程序,原因:"(setValue:withCompletionBlock:)无法在投标人 .0 处存储类型 _SwiftValue 的对象。只能存储 NSNumber、NSString、NSDictionary 和 NSArray 类型的对象。

您正在尝试在 Firebase 中设置一个包含Bidder对象的数组:

在您的ChitObject

var bidders: [Bidder]

toAnyObject()方法:

"bidders":bidders

Firebase将不知道这是什么,并且根据错误消息期望NSNumber, NSString, NSDictionary, or NSArray.。(它是您自己的自定义对象的数组)。

尝试将出价方数组映射到出价方数组 .toAnyClass(),以便它们都使用 Firebase 基元类型。

相关内容

最新更新