Ios 在Swift中将数组发布到firebase数据库

Ios 在Swift中将数组发布到firebase数据库,ios,json,swift,firebase,firebase-realtime-database,Ios,Json,Swift,Firebase,Firebase Realtime Database,问题 我需要将数据发布到firebase数据库中,该数据库(就数组而言)只能接受类型NSArray。但是,应用程序需要添加到阵列中 将发布的Json数据 Object: someObjectKey[ ArrayOfItems[ Item: someItemNumber Item: someItemNumber Item: someItemNumber ] TimeStamp: 102047355 SomeOtherTimeStamp: null Som

问题
我需要将数据发布到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
}

干杯

我记不清确切的原因是什么,但在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.
        }

我希望它能为您节省一些时间和麻烦:)

我记不清确切的原因是什么,但在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.
        }

我希望它能为您节省一些时间和麻烦:)

您的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创建父节点。然后将子节点添加为键:值对,项的子节点也是键:值对的字典

最后用一个字母写字典

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

您的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创建父节点。然后将子节点添加为键:值对,项的子节点也是键:值对的字典

最后用一个字母写字典

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

这里有什么错误?请不要将数组存储在Firebase中。您无法访问特定元素。必须读入整个数组才能获取元素,如果在数组中添加或更改某些内容,则必须完全替换整个数组。此外,您不能插入。应该不惜一切代价避免数组。啊,这样就不会是字典数组了?这里有什么错误?请不要将数组存储在Firebase中。您无法访问特定元素。必须读入整个数组才能获取元素,如果在数组中添加或更改某些内容,则必须完全替换整个数组。此外,您不能插入。应该不惜一切代价避免数组。啊,这样它就不是一个字典数组了?嗨,如果这是延迟评论,很抱歉。我一直在努力解决同样的问题。然而,一旦您对数据进行了非规范化,您将如何获得该引用的详细信息。因此,从您的示例
-Y9jkoma9kmmsd:true
。如何获取它的
itemName
itemPrice
@Chace您将在您想要读取的节点上观察到单个事件,因为您知道它是键。在我的示例的后半部分中,我建议将这些项保留在一个单独的节点中,并引用它们。因此,items节点将是items/item_0/子节点和items/item_1/子节点。一旦知道项目的键(例如YMNK0S0K98S),只需观察/Items/Ymnk0s0s0k98s即可检索该项目及其所有子项(itemName、itemPrice等)谢谢,我会试一试,如果我仍然不确定,我会发布一个新的问题。你能像上面提到的那样创建字典吗?我当然能。但是,答案应该是针对特定于您的用例的不同问题。请你发布一个问题,包括你尝试过的代码和你正在使用的Firebase结构(作为文本,请不要图片或链接),我会看一看并写出一个合适的答案。链接到这里,嗨,抱歉,如果这是延迟评论。我一直在努力解决同样的问题。然而,一旦您对数据进行了非规范化,您将如何获得该引用的详细信息。因此,从您的示例
-Y9jkoma9kmmsd:true
。如何获取它的
itemName
itemPrice
@Chace您将在您想要读取的节点上观察到单个事件,因为您知道它是键。在我的示例的后半部分中,我建议将这些项保留在一个单独的节点中,并引用它们。因此,items节点将是items/item_0/子节点和items/item_1/子节点。一旦知道项目的键(例如YMNK0S0K98S),只需观察/Items/Ymnk0s0s0k98s即可检索该项目及其所有子项(itemName、itemPrice等)谢谢,我会试一试,如果我仍然不确定,我会发布一个新的问题。你能像上面提到的那样创建字典吗?我当然能。但是,答案应该是针对特定于您的用例的不同问题。你可以发布一个问题,包括你尝试过的代码和你正在使用的Firebase结构(作为文本,请不要图片或链接),我会看一看