使用 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(疯狂)
我有一个看起来像这样的数据库:
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(疯狂)