【问题标题】:Post Array to firebase Database in Swift在 Swift 中将数组发布到 firebase 数据库
【发布时间】:2017-03-30 04:33:24
【问题描述】:

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

干杯

【问题讨论】:

  • 这里有什么错误?
  • 请不要将数组存储在 Firebase 中。您无法访问特定元素。如果您在数组中添加或更改某些内容,则必须读取整个数组以获取元素或完全替换。此外,您不能插入。应该不惜一切代价避免使用数组。
  • 啊,所以不会是字典数组吧?

标签: ios json swift firebase firebase-realtime-database


【解决方案1】:

我不记得确切的原因是什么,但在 android 和 Ios 中也遇到了类似的问题。解决方法是先将数组转换为字典来保存数组。

假设我有一组经度和纬度:

我首先创建一个类来包装纬度和经度。我有一个函数来获取包含所需数据的字典。

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.
        }

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

【讨论】:

    【解决方案2】:

    您的 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 创建父节点。然后将子节点添加为 key:value 对,Items 的子节点也是 key:value 对的 Dictionary。

    最后用a写字典

    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
    

    【讨论】:

    • 嗨,抱歉,如果这是延迟评论。我一直在尝试解决同样的问题。但是,一旦您对数据进行非规范化,您如何获得该参考的详细信息。所以从你的例子-Y9jkoma9kmmsd: true。我怎么会得到它是itemNameitemPrice
    • @Chace 您会在要读取的节点上观察SingleEvent,因为您知道它是关键。在我示例的后半部分,我建议将项目保存在单独的节点中并引用它们。所以 items 节点将是 Items/item_0/child 节点和 Items/Item_1/child 节点。一旦您知道项目的密钥(例如 Ymnk0s0s0k98s),只需观察 /Items/Ymnk0s0s0k98s 即可检索该项目及其所有子项(itemName、itemPrice 等)
    • 谢谢,我会试一试,如果我仍然不确定,我会围绕这个问题发布一个新问题。
    • 你能像上面提到的那样创建字典吗?
    • @Chace 我当然可以。但是,答案应该是针对特定于您的用例的不同问题。您能否发布一个问题,包括您尝试过的代码和您正在使用的 Firebase 结构(请作为文本,没有图像或链接),我会看一下并写一个适当的答案。在这里链接,
    猜你喜欢
    • 2018-03-11
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多