使用 Swift 在 Firebase 中检索子数组

Retrieving an array of children in Firebase using Swift

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

Firebase
餐馆
麦当劳
菜单项 1:汉堡
菜单项 2:薯条
菜单项 3:饮料
肯德基
菜单项 1:鸡肉
菜单项 2:土豆泥
菜单项 3:饮料
塔可钟
菜单项 1:炸玉米饼
菜单项 2:卷饼
菜单项 3:饮料

如何检索只有餐厅名称的列表(数组或字典都可以),而没有它们各自的菜单项?

理想情况下,输出类似于 ["McDonalds"、"KFC"、"Taco Bell"],带有可访问的索引或键。

你可以这样做:

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 接收完整的餐厅对象,但只是使用它们的键(名称)。

您可以通过以下方法完成此操作:-

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

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

希望这对你有用。

答案是,您不能只有 return 个键。您问题中的结构可能会带来一些挑战,因为文本数据和节点名称之间的 link 太多了。

这里有一个可选的结构,可以将所有内容分开以便于查询。

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's 决定用 Roast Beef Max(哦,是的!)替换 Roast Beef Classic(哦,不!),您只需更改名称组件不影响其他数据

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

我自己是新手,虽然整个 fire base 非常棒,但教程对我来说有点模糊。恐龙 rah rah 等。无论如何,在花了很长时间摆弄数组来填充 tableviews 之后,我开始明白了。或者可能不是?不知道。但是可以肯定的是,您可以通过观察事件类型 childAdded 来获取密钥,然后 snapshot.value 为您提供了要遍历的整个错误,而 snapshot.key 则一次为您提供了一个单独的密钥: 变量 boink = snapshot.key MyboinkArray.append(疯狂)