如何在字典数组中转换 FIRDataSnapshot?斯威夫特 3
Posted
技术标签:
【中文标题】如何在字典数组中转换 FIRDataSnapshot?斯威夫特 3【英文标题】:How to convert FIRDataSnapshot in array of dictionaries? Swift 3 【发布时间】:2017-06-13 15:30:18 【问题描述】:我创建了“struct FireBaseData”,它使我能够从 Firebase 中检索数据。我想将数据转换为字典数组,然后将内容以 .txt 文件的形式输出到桌面。
如何将self.bookingInfo
转换为字典数组?
func startObservingDB()
dbRef.child(FullData.uid!).observe(.value, with: (snapshot: FIRDataSnapshot) in
// an instance of FireBaseData holding all bookings under currentUid
var newBookingInfo = [FireBaseData]()
//iterate over all children under /FullData.uid! path
for customer in snapshot.children
//the customer node starting with cus...
let customerObject = customer as! FIRDataSnapshot
//customer key
self.customerKey = customerObject.key
print("this is the Stripe customer that can be charged \(customerObject.key)")
//now iterate over each booking which is located under customerObject in Firebase
for booking in customerObject.children
// after each iteration through snapshot.children, create an instance of FireBaseData with 'booking' for the current iteration & assign it to bookingItem
var bookingItem = FireBaseData(snapshot: booking as! FIRDataSnapshot)
//assign key of the parent to each booking
bookingItem.Key = self.customerKey
// append the bookingItem after each iteration to newBookingInfo array
newBookingInfo.append(bookingItem)
// end of for booking in myCustomer
// end of for customer in snapshot.children
//assign newBookingInfo to global variable
self.bookingInfo = newBookingInfo
// sort the array in place so that the most recent date will appear first
self.bookingInfo.sort(by: (DateAndTimeObject_1,DateAndTimeObject_2) -> Bool in
DateAndTimeObject_1.TimeStampDateAndTime > DateAndTimeObject_2.TimeStampDateAndTime
)
let arrayOfDictionary = self.bookingInfo.flatMap $0.toAnyObject() as? [String:Any]
let stringSeparated = arrayOfDictionary.joined(separator: "-")
print("stringSeparated \(stringSeparated)")
self.tableView.reloadData()
, withCancel: (Error:Any) in
print("Error firebase \(Error)")
)
// end of startObservingDB()
//Model to retrive data
import Foundation
import UIKit
import Firebase
import FirebaseDatabase
struct FireBaseData
// Create our Firebase Data model
// get arbitrary data
var FirebaseUserID:String!
var PaymentID:String!
var BookingAmount:String!
var BookingNumber:String!
var Key:String!
var PostCode:String!
var SelectedBathRow:Int!
var SelectedBedRow:Int!
var DateAndTime:String!
var TimeStampDateAndTime:Int!
var TimeStampBookingSavedInDB:Int!
var BookingStatusClient:Bool!
var BookingStatusAdmin:Bool!
var BookingCompleted:Bool!
//used in RootController and RootController1 to determine if the booking has already been cancelled or not
var CostToCancelClient:String!
var CostToCancelAdmin:String!
var CostToRescheduleAdmin:String!
var CostToRescheduleClient:String!
var DoormanOption:String!
var EntryInstructions:String!
var NoteInstructions:String!
var FrequencyName:String!
var FrequecyAmount:Int!
var insideCabinets:Bool!
var insideFridge:Bool!
var insideOven:Bool!
var laundryWash:Bool!
var interiorWindows:Bool!
var SuppliesName:String!
var SuppliesAmount:Int!
var FullName:String!
var FlatNumber:String!
var StreetAddress:String!
var PhoneNumber:String!
var EmailAddress:String!
let Ref:FIRDatabaseReference?
init(BookingAmount:String,
BookingNumber:String,
PostCode:String,
SelectedBathRow:Int,
SelectedBedRow:Int,
DateAndTime:String,
TimeStampDateAndTime:Int,
BookingStatusClient:Bool,
BookingStatusAdmin:Bool,
BookingCompleted:Bool,
FrequencyName:String,
FrequecyAmount:Int,
insideCabinets:Bool,
insideFridge:Bool,
insideOven:Bool,
laundryWash:Bool,
interiorWindows:Bool,
FullName:String,
SuppliesName:String,
SuppliesAmount:Int,
FlatNumber:String,
StreetAddress:String,
PhoneNumber:String,
EmailAddress:String,
Key:String = "")
self.BookingAmount = BookingAmount
self.BookingNumber = BookingNumber
self.Key = Key
self.PostCode = PostCode
self.SelectedBathRow = SelectedBathRow
self.SelectedBedRow = SelectedBedRow
self.DateAndTime = DateAndTime
self.TimeStampDateAndTime = TimeStampDateAndTime
self.BookingStatusClient = BookingStatusClient
self.BookingStatusAdmin = BookingStatusAdmin
self.BookingCompleted = BookingCompleted
self.FrequencyName = FrequencyName
self.FrequecyAmount = FrequecyAmount
self.insideCabinets = insideCabinets
self.insideFridge = insideFridge
self.insideOven = insideOven
self.laundryWash = laundryWash
self.interiorWindows = interiorWindows
self.FullName = FullName
self.SuppliesName = SuppliesName
self.SuppliesAmount = SuppliesAmount
self.FlatNumber = FlatNumber
self.StreetAddress = StreetAddress
self.PhoneNumber = PhoneNumber
self.EmailAddress = EmailAddress
self.Ref = nil
// Content
// receive data from our firebase database
init(snapshot:FIRDataSnapshot)
if let firebaseUserID = (snapshot.value! as? NSDictionary)?["FirebaseUserID"] as? String
FirebaseUserID = firebaseUserID
if let paymentID = (snapshot.value! as? NSDictionary)?["PaymentID"] as? String
PaymentID = paymentID
if let BookingAmountContent = (snapshot.value! as? NSDictionary)?["BookingAmount"] as? String
BookingAmount = BookingAmountContent
if let BookingNumberContent = (snapshot.value! as? NSDictionary)?["BookingNumber"] as? String
BookingNumber = BookingNumberContent
Key = snapshot.key
Ref = snapshot.ref
if let PostCodeContent = (snapshot.value! as? NSDictionary)?["PostCode"] as? String
PostCode = PostCodeContent
if let SelectedBathRowContent = (snapshot.value! as? NSDictionary)?["SelectedBathRow"] as? String
SelectedBathRow = Int(SelectedBathRowContent)
if let SelectedBedRowContent = (snapshot.value! as? NSDictionary)?["SelectedBedRow"] as? String
SelectedBedRow = Int(SelectedBedRowContent)
if let DateAndTimeContent = (snapshot.value! as? NSDictionary)?["DateAndTime"] as? String
DateAndTime = DateAndTimeContent
if let TimeStampDateAndTimeContent = (snapshot.value! as? NSDictionary)?["TimeStampDateAndTime"] as? String
TimeStampDateAndTime = Int(TimeStampDateAndTimeContent)
if let TimeStampBookingSavedInDBContent = (snapshot.value! as? NSDictionary)?["TimeStampBookingSavedInDB"] as? String
TimeStampBookingSavedInDB = Int(TimeStampBookingSavedInDBContent)
if let BookingStatusClientContent = (snapshot.value! as? NSDictionary)?["BookingStatusClient"] as? String
BookingStatusClient = Bool(BookingStatusClientContent)
if let BookingStatusAdminContent = (snapshot.value! as? NSDictionary)?["BookingStatusAdmin"] as? String
BookingStatusAdmin = Bool(BookingStatusAdminContent)
if let BookingCompletedContent = (snapshot.value! as? NSDictionary)?["BookingCompleted"] as? String
BookingCompleted = Bool(BookingCompletedContent)
if let costToCancelCient = (snapshot.value! as? NSDictionary)?["CostToCancelClient"] as? String
CostToCancelClient = costToCancelCient
if let costToCancelAdmin = (snapshot.value! as? NSDictionary)?["CostToCancelAdmin"] as? String
CostToCancelAdmin = costToCancelAdmin
if let costToRescheduleAdmin = (snapshot.value! as? NSDictionary)?["CostToRescheduleAdmin"] as? String
CostToRescheduleAdmin = costToRescheduleAdmin
if let costToRescheduleClient = (snapshot.value! as? NSDictionary)?["CostToRescheduleClient"] as? String
CostToRescheduleClient = costToRescheduleClient
if let doormanOption = (snapshot.value! as? NSDictionary)?["DoormanOption"] as? String
DoormanOption = doormanOption
if let entryInstructions = (snapshot.value! as? NSDictionary)?["EntryInstructions"] as? String
EntryInstructions = entryInstructions
if let noteInstructions = (snapshot.value! as? NSDictionary)?["NoteInstructions"] as? String
NoteInstructions = noteInstructions
if let FrequencyNameContent = (snapshot.value! as? NSDictionary)?["FrequencyName"] as? String
FrequencyName = FrequencyNameContent
if let FrequecyAmountContent = (snapshot.value! as? NSDictionary)?["FrequecyAmount"] as? String
FrequecyAmount = Int(FrequecyAmountContent)
if let insideCabinetsContent = (snapshot.value! as? NSDictionary)?["InsideCabinets"] as? String
insideCabinets = Bool(insideCabinetsContent)
if let insideFridgeContent = (snapshot.value! as? NSDictionary)?["InsideFridge"] as? String
insideFridge = Bool(insideFridgeContent)
if let insideOvenContent = (snapshot.value! as? NSDictionary)?["InsideOven"] as? String
insideOven = Bool(insideOvenContent)
if let laundryWashContent = (snapshot.value! as? NSDictionary)?["LaundryWash"] as? String
laundryWash = Bool(laundryWashContent)
if let interiorWindowsContent = (snapshot.value! as? NSDictionary)?["InteriorWindows"] as? String
interiorWindows = Bool(interiorWindowsContent)
if let FullNameContent = (snapshot.value! as? NSDictionary)?["FullName"] as? String
FullName = FullNameContent
if let SuppliesNameContent = (snapshot.value! as? NSDictionary)?["SuppliesName"] as? String
SuppliesName = SuppliesNameContent
if let SuppliesAmountContent = (snapshot.value! as? NSDictionary)?["SuppliesAmount"] as? String
SuppliesAmount = Int(SuppliesAmountContent)
if let FlatNumberContent = (snapshot.value! as? NSDictionary)?["FlatNumber"] as? String
FlatNumber = FlatNumberContent
if let StreetAddressContent = (snapshot.value! as? NSDictionary)?["StreetAddress"] as? String
StreetAddress = StreetAddressContent
if let PhoneNumberContent = (snapshot.value! as? NSDictionary)?["PhoneNumber"] as? String
PhoneNumber = PhoneNumberContent
if let EmailAddressContent = (snapshot.value! as? NSDictionary)?["EmailAddress"] as? String
EmailAddress = EmailAddressContent
func toAnyObject() -> AnyObject
var someDict = [String : Any]()
someDict["FirebaseUserID"] = self.FirebaseUserID as AnyObject?
someDict["PaymentID"] = self.PaymentID as AnyObject?
someDict["BookingAmount"] = self.BookingAmount as AnyObject?
someDict["BookingNumber"] = self.BookingNumber as AnyObject?
someDict["PostCode"] = self.PostCode as AnyObject?
someDict["SelectedBathRow"] = self.SelectedBathRow as AnyObject?
someDict["SelectedBedRow"] = self.SelectedBedRow as AnyObject?
someDict["DateAndTime"] = self.DateAndTime as AnyObject?
someDict["TimeStampDateAndTime"] = self.TimeStampDateAndTime as AnyObject?
someDict["TimeStampBookingSavedInDB"] = self.TimeStampBookingSavedInDB as AnyObject?
someDict["BookingStatusClient"] = self.BookingStatusClient as AnyObject?
someDict["BookingStatusAdmin"] = self.BookingStatusAdmin as AnyObject?
someDict["BookingCompleted"] = self.BookingCompleted as AnyObject?
someDict["CostToCancelClient"] = self.CostToCancelClient as AnyObject?
someDict["CostToCancelAdmin"] = self.CostToCancelAdmin as AnyObject?
someDict["CostToRescheduleAdmin"] = self.CostToRescheduleAdmin as AnyObject?
someDict["CostToRescheduleClient"] = self.CostToRescheduleClient as AnyObject?
someDict["DoormanOption"] = self.DoormanOption as AnyObject?
someDict["EntryInstructions"] = self.EntryInstructions as AnyObject?
someDict["NoteInstructions"] = self.NoteInstructions as AnyObject?
someDict["FrequencyName"] = self.FrequencyName as AnyObject?
someDict["FrequecyAmount"] = self.FrequecyAmount as AnyObject?
someDict["insideCabinets"] = self.insideCabinets ? "true" : "false"
someDict["insideFridge"] = self.insideFridge ? "true" : "false"
someDict["insideOven"] = self.insideOven ? "true" : "false"
someDict["laundryWash"] = self.laundryWash ? "true" : "false"
someDict["interiorWindows"] = self.interiorWindows ? "true" : false
someDict["FullName"] = self.FullName as AnyObject?
someDict["SuppliesName"] = self.SuppliesName as AnyObject?
someDict["SuppliesAmount"] = self.SuppliesAmount as AnyObject?
someDict["FlatNumber"] = self.FlatNumber as AnyObject?
someDict["StreetAddress"] = self.StreetAddress as AnyObject?
someDict["PhoneNumber"] = self.PhoneNumber as AnyObject?
someDict["EmailAddress"] = self.EmailAddress as AnyObject?
return someDict as AnyObject
Desired Output as per Nirav request
EmailAddress": johnmm@gmail.com,
"PhoneNumber": 07476953923,
“付款 ID”:ch_1ARd6yLCZ34Ur7XG4wAqaH9H, “BookingAmount”:27
EmailAddress": Chris@gmail.com,
"PhoneNumber": 07476953923,
"PaymentID": ch_1ARd6yLCZ34Ur7XG4wAqaH9H,
"BookingAmount": 27
EmailAddress": Mike@gmail.com,
"PhoneNumber": 07476953923,
"PaymentID": ch_1ARd6yLCZ34Ur7XG4wAqaH9H,
"BookingAmount": 27
【问题讨论】:
【参考方案1】:您只需要像这样使用toAnyObject()
方法从您的FireBaseData
获取字典对象。
let arrayOfDictionary = self.bookingInfo.flatMap $0.toAnyObject() as? [String:Any]
您将在arrayOfDictionary
中获得您想要的结果,它是[[String:Any]]
的类型
【讨论】:
它正在工作,但是有一个问题,当我按照您上面的建议调用toAnyObject()
函数时,arrayOfDictionary
中的布尔值显示为 Int,其中 1 表示真,0 表示假,而不是真假。鉴于我的初始模型,我将如何获得 Bool 值的字符串值的结果。
我试图将 arrayOfDictionary
内容输出到 .txt 文件到桌面,这就是为什么我需要为这些值使用 String 而不是 Bool
@bibscy 好的,那么您可以做的就是再制作一种这样的方法,因为您无法更改此方法,因为您将这个方法与 Firebase 一起使用,然后当您使用键设置布尔值时设置它像这样。 someDict["insideOven"] = self.insideOven ? "true" : "false"
我想对数组内的字典进行排序,它们之间有一个中断,以便我可以在 .txt 文件中的桌面上很好地输出它们,但我收到错误:参数传递给不带参数的调用. ` let stringSeparated = arrayOfDictionary.joined(separator: "-")`
让我们continue this discussion in chat。以上是关于如何在字典数组中转换 FIRDataSnapshot?斯威夫特 3的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Azure 流分析中的“类字典”结构转换为带有 javascript UDF 的多维数组?