2016-04-27 64 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