2016-04-27 62 views
0

我有一個看起來像這樣一個數據庫,火力地堡兒童的數組:檢索用斯威夫特

火力地堡
 餐館
   麥當勞
     菜單項1:漢堡
     菜單項2:薯條
     菜單項目3:喝
    KFC
     菜單項目1:雞
     菜單項2:土豆泥
     菜單項3:喝
   塔克貝爾
     菜單項1:taco
     菜單項2:捲餅
     菜單項3:喝

我怎麼只能檢索餐廳的名稱(數組或字典是罰款)的列表,沒有相應的項目?

理想情況下,輸出看起來像[「麥當勞」,「肯德基」,「塔可鍾」],具有可訪問的索引或鍵。

+0

有答案,但底線答案是,你不能。 Firebase始終會返回鍵值對。您將遇到有關Firebase數據結構的問題 - 請參閱我的備選答案。 – Jay

回答

1

你可以這樣做:

var ref = Firebase(url: "https://<yourApp>.firebaseio.com/restaurants/") 

ref.observeEventType(.Value, withBlock: { 
    snapshot in 
    var restaurantNames = [String]() 
    for restaurant in snapshot.children { 
     restaurantNames.append(restaurant.key) 
    } 
    print(restaurantNames) 
}) 

restaurantNames將有你要的數組。您仍然收到來自Firebase的完整餐廳對象,但只是使用它們的鍵(名稱)。

+0

噢,這個和我已經很接近了,謝謝! –

+0

剛剛添加它,它做我所需要的完美,謝謝! –

0

您可以通過下面的計算策略完成這件事: -

func getDataSource() 
{  
    let macdArray = ["Menu Item 1" : "burger","Menu Item 2" : "fries","Menu Item 3" : "drink"] 
    let macdDict = ["McDonalds":macdArray] 
    let kfcArray = ["Menu Item 1" : "chicken","Menu Item 2" : "mashed potatoes","Menu Item 3" : "drink"] 
    let kfcDict = ["KFC":kfcArray] 
    let tacobellDArray = ["Menu Item 1" : "taco","Menu Item 2" : "burrito","Menu Item 3" : "drink"] 
    let tacobellDict = ["Taco Bell":tacobellDArray] 
    let restaurentArray = [macdDict,kfcDict,tacobellDict] as NSMutableArray 
    let restaurentDict = ["restaurants":restaurentArray] 

    let parentDict = ["Firebase":restaurentDict] as NSDictionary 

    print(parentDict.objectForKey("Firebase")?.objectForKey("restaurants")) 

    let consolidatedArray = NSMutableArray() 

    for var i = 0; i < restaurentArray.count; i++ { 
     consolidatedArray.addObject(restaurentArray.objectAtIndex(i).allKeys) 
    } 

    print(consolidatedArray) 
} 

我已經使用了你的數據,如靜態數據,你不得不更換您從後端recieving數據。

希望這對你有用。

2

答案是,你不能只是返回鍵。由於文本數據和節點名稱之間存在太多聯繫,因此您的問題中的結構可能會帶來一些挑戰。

下面是一個可選結構,它將所有內容分開以便查詢。

restaurants 
    restaurant_id_0 
    restaurant_ref: restaurant_name_0 
    menu: 
     menu_id_0: 
      name: Burger 
     menu_id_1 
      name: Fries 
     menu_id_2 
      name: Beer! 
    restaurant_id_1 
    restaurant_ref: restaurant_name_1 
    menu 
     menu_id_0: 
      name: Roast Beef Classic 
     menu_id_1 
      name: Curly Fries 
     menu_id_2 
      name: Milkshake 

,然後名稱

restaurant_names 
    restaurant_name_0: McDonalds 
    restaurant_name_1: Arby's 

通過這種結構,你是從哪個舉辦使您可以輕鬆地查詢從restaurent_name節點的所有餐廳名稱的數據節點分離的字符串數據。您也可以查詢菜單上的哪家餐館有漢堡包。甚至找到那些提供奶昔的人。

我甚至建議打破了菜單的出扁平化進一步的數據。

menus 
    restaurent_id_0 
    menu_id_0: 
     name: Burger 
    menu_id_1 
     name: Fries 
    menu_id_2 
     name: Beer! 

任何一項都將工作和利益這種結構是,如果阿拜的決定更換烤牛肉經典(哦不!)與烤牛肉最大一個(哦,是的!),你可以改變的名稱部分,而不影響其他數據

/restaurant_id_1/menu/menu_id_0/name = "Roast Beef Max" 
+0

太棒了,非常感謝! –

+0

@JoeSloan試試這個結構 - 這是Firebase的常見設計模式。如果有幫助,請接受我的回答! – Jay

+0

嗨Jay,你能解釋一下你的答案和Eirik Berntsen之間的區別嗎?我可以用他的答案得到我需要的數組,但也許按照您的建議重新構建數據庫有一個優勢? –

0

我是新在這個自己&而整個消防基礎的東西是輝煌的,該教程是對我來說有點含糊。恐龍rah rah等等。無論如何,在花費時間擺弄數組來填充tableviews後,我開始明白了。或者可能不是?不知道。但相當肯定你可以通過觀察事件類型childAdded然後獲取快照。值來獲得密鑰,它可以讓你用整個工具遍歷並且快照.key一次給你一個密鑰: var boink = snapshot.key MyboinkArray.append(boink)

+0

https://www.udacity.com/course/firebase-essentials-for-android--ud009也許這有助於 – Alexis