2016-11-16 43 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