2016-11-16 46 views
0

问题
我需要将数据上传到火力数据库,该数据库(在阵列而言)只能接受类型NSArray。然而,应用程序需要添加到阵列邮政阵列,以火力数据库斯威夫特

JSON数据是西港岛线发布

Object: someObjectKey[ 
    ArrayOfItems[ 
    Item: someItemNumber 
    Item: someItemNumber 
    Item: someItemNumber 
    ] 
    TimeStamp: 102047355 
    SomeOtherTimeStamp: null 
    SomeInt: 1111 
    someOtherInt: 2222 
    SomeBoolean: false 
    ] 
} 

目标
如何,我可以得到上述被推成数据库中的数据?

试图大道
- 转换一个SwiftArrayNSArray
- 转换的NSMutableArrayNSArray

代码

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

这里有什么错误? –

+0

请勿将阵列存储在Firebase中。您无法访问特定元素。如果添加或更改数组中的某些内容,必须读入整个数组以获取元素或完全替换。另外,你不能插入。阵列应该不惜一切代价避免。 – Jay

+0

啊,所以它不会是一个字典数组? –

回答

2

我不记得究竟是什么原因,但也确实面临类似的问题,在android和Ios.workaround是通过首先将其转换为字典来保存数组。

让我们说我有经度和纬度的数组:

我首先要建立包lat和长时间的类。我有一个函数来获取包装所需数据的字典。

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 
} 

}

只是保存阵列火力之前,首先转换该阵列使用上述类字典。

 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. 

`

现在我们可以将它保存到火力地堡。

self.reference.child("yourKey").child(key).updateChildValues(dict) { (error: NSError?, reference: FIRDatabaseReference) in 
      completion(error) // if some error handle it. 
     } 

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

+0

谢谢,好像是一个很好的领导,会在AM –

1

你的火力地堡结构应该像这样

-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对的字典。

最后写有

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 
+0

上检查一下这个,嗨,对不起,如果这是延迟评论。我一直在试图解决同样的问题。但是,一旦你对数据进行非规范化处理,你如何获得该参考的详细信息。所以从你的例子'-Y9jkoma9kmmsd:true'。我如何得到它的'itemName'和'itemPrice'。 – Chace

+0

@Chace你会在你想读的节点上观察到单一事件,因为你知道它是关键。在我的例子的后半部分,我建议将这些项目保存在一个单独的节点中并引用它们。所以items节点将是Items/item_0/child节点,以及Items/Item_1/child节点。一旦你知道该项目的关键(例如Ymnk0s0s0k98s),只需观察/ Items/Ymnk0s0s0k98s将检索该项目及其所有的孩子(itemName,itemPrice等) – Jay

+0

谢谢我会给它一个,如果我仍然不确定,那么我会发布一个新的问题。 – Chace