我正在尝试将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 数据。下面是两个类的代码。
Bidder.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!
]
}}
Chit.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
]
}}
ViewController.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())
输出: ***由于未捕获的异常'InvalidFirebaseData'而终止应用程序,原因:'(setValue:withCompletionBlock :)无法在bidders.0中存储_SwiftValue类型的对象。只能存储NSNumber,NSString,NSDictionary和NSArray类型的对象。'
答案 0 :(得分:1)
您正尝试在firebase中设置Bidder
个对象数组:
在ChitObject
:
var bidders: [Bidder]
toAnyObject()
方法:
"bidders":bidders
根据错误消息,Firebase不会知道这是什么,并期望NSNumber, NSString, NSDictionary, or NSArray.
。 (它是您自己的自定义对象的数组)。
尝试将您的投标人数组映射到bidders.toAnyClass()数组中,以便他们都使用Firebase基元类型。