使用Swift在Firebase中检索子项数组

时间:2016-04-27 06:04:25

标签: ios xcode swift firebase children

我有一个看起来像这样的数据库:

火力地堡
    餐厅
        麦当劳
            菜单项1:汉堡
            菜单项2:薯条
            菜单项3:饮料
        肯德基
            菜单项1:鸡肉             菜单项2:土豆泥
            菜单项3:饮料
        Taco Bell
            菜单项1:taco
            菜单项2:墨西哥卷饼             菜单项3:饮料

如何在没有相应菜单项的情况下检索只有餐馆名称(数组或字典很好)的列表?

输出最好看起来像[“McDonalds”,“KFC”,“Taco Bell”],带有可访问的索引或键。

4 个答案:

答案 0 :(得分: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!

如果Arby决定用Roast Beef Max代替烤牛肉经典(哦不!),那么这些结构中的任何一个都会起作用,这个结构的好处之一是你可以改变它名称组件,不影响其他数据

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

答案 1 :(得分:1)

您可以执行以下操作:

<div style="width: 200px;height:200px;padding:50px;background-color: lightcyan" id="maindiv" onclick="subdiv()"></div>

restaurantNames将拥有您要求的阵列。您仍然从firebase接收完整的餐馆对象,但只使用他们的密钥(名称)。

答案 2 :(得分:0)

您可以通过下面的approch完成此操作: -

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

我已将您的数据用作静态数据,您只需要替换从后端接收的数据。

希望这适合你。

答案 3 :(得分:0)

我自己就是新手了虽然整个火基都很棒,但教程对我来说有点模糊。恐龙rah rah等无论如何,花了很多年的时间摆弄数组来填充表格,我开始得到它。或者可能不是?不知道。但是很确定你可以通过观察事件类型childAdded来获取密钥,然后使用snapshot.value来为你提供整个malark迭代和snapshot.key,它一次为你提供一个密钥: var boink = snapshot.key MyboinkArray.append(boink)