问题
我需要将数据发布到firebase数据库中,该数据库(就数组而言)只能接受类型NSArray
。但是,应用程序需要添加到数组
将张贴的Json数据
Object: someObjectKey[
ArrayOfItems[
Item: someItemNumber
Item: someItemNumber
Item: someItemNumber
]
TimeStamp: 102047355
SomeOtherTimeStamp: null
SomeInt: 1111
someOtherInt: 2222
SomeBoolean: false
]
}
目标
如何将上面的数据推送到数据库中?
尝试途径
- 将SwiftArray
转换为NSArray
- 将NSMutableArray
转换为NSArray
代码
public func postToFireBase(){
var Timestamp: String {
return "\(NSDate().timeIntervalSince1970 * 1000)"
}
var someInt = 1111
var someOtherInt = 2222
let myArrayOfStuff = convertItemsToNSArray()
let post: [String : Any] = ["timestamp": Timestamp,
"someInt": someInt,
"someOtherInt": someOtherInt,
"items": ItemList]
//Method Call References the FIRDatabase.database.reference.child...
FirebaseDatabaseService.databaseReference.setValue(post)
}
private func convertItemsToNSArray() -> NSArray{
var thisArray: NSMutableArray = []
for item in items{
thisArray.add(["name": "Foo",
"key": "Bar",
"someCoolInt": 1234])
}
return thisArray
//This won't work because it's coming back as NSMutableArray anyway
}
干杯
答案 0 :(得分:2)
我记不清究竟是什么原因,但在android和Ios中也遇到过类似的问题。工作方法是首先将数组转换为字典来保存数组。
假设我有一系列经度和纬度:
我首先创建一个包装lat和long的类。我有一个函数来获取包装所需数据的字典。
class HiddenLatlng {
private var latitude: Double
private var longitude: Double
init(lat: Double, lng: Double) {
self.latitude = lat
self.longitude = lng
}
func toDictionery() -> [ String : Double ] {
var dict = [ String : Double ]()
dict["latitude"] = self.latitude
dict["longitude"] = self.longitude
return dict
}
}
在将数组保存到firebase之前,首先使用上面的类将此数组转换为字典。
var dict = [String: AnyObject]() // main dictionary saved to firebase
var dictArray = [ String : [String: Double] ]() // temp dictionary
for (index, element) in hide.vertices.enumerate(){
dictArray[String(index)] = HiddenLatlng(lat: element.latitude, lng: element.longitude).toDictionery()
}
dict["eventLatLngList"] = dictArray // add temp dictionary to main dictionary.
`
现在我们可以将它保存到firebase。
self.reference.child("yourKey").child(key).updateChildValues(dict) { (error: NSError?, reference: FIRDatabaseReference) in
completion(error) // if some error handle it.
}
我希望它可以节省你一些时间和麻烦:)
答案 1 :(得分:1)
您的Firebase结构应如下所示
-Yk8hsinuoioas90kp
TimeStamp: 102047355
SomeOtherTimeStamp: null
SomeInt: 1111
someOtherInt: 2222
SomeBoolean: false
Items
-Y9jkoma9kmmsd
itemName: "The best item"
itemPrice: "1.90"
-Ymnk0s0s0k98s
itemName: "Another great item"
itemPrice: "9.99"
-JYOjsomojkspy
itemName: "The best item evah"
itemPrice: "4.99"
为此,您只需创建一个字典,并使用childByAutoId创建父节点。然后将子节点添加为键:值对,Items的子节点也是键:值对的字典。
最后用
写字典let thisThingRef = ref.childByAutoId()
thisThingRef.setValue(myDict)
如果需要,我可以制作一些代码来创建该词典。
哦......你可能想要对数据进行非规范化处理,并将项目存储在一个单独的节点中,并保留对它的引用
-Yk8hsinuoioas90kp
TimeStamp: 102047355
SomeOtherTimeStamp: null
SomeInt: 1111
someOtherInt: 2222
SomeBoolean: false
Items
-Y9jkoma9kmmsd: true
-Ymnk0s0s0k98s: true
-JYOjsomojkspy: true