2016-04-27 8 views
0

У меня есть база данных, которая выглядит примерно так:Получение массива детей в Firebase с помощью Swift

Firebase
  ресторанов
    McDonalds
      Пункт меню 1: гамбургер
      Пункт меню 2: картофель фри
      Пункт меню 3: пить
    KFC
      Пункт меню 1: курица
      Пункт меню 2: картофельное пюре
      Меню Пункт 3: пить
    Taco Bell
      Пункт меню 1: taco
   Пункт меню 2: буррито
      Пункт меню 3: пить

Как я могу получить список только названия ресторана (массив или словарь отлично), без соответствующих пунктов меню?

вывод идеально выглядел бы как «[McDonalds», «KFC», «Taco Bell»] с доступным индексом или ключом.

+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

Вы можете получить это сделать по 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) 
} 

Я использовал свои данные как статические данные, все, что вы должны заменить данные, которые вы ПОЛУЧАТЬ из внутреннего интерфейса.

Надеюсь, это сработает для вас.

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. Вы также можете запросить, в каких ресторанах есть меню Burger. Даже найти те, которые предлагают Milkshake.

Я мог бы даже предложить сломать меню, чтобы сгладить данные дальше.

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

Любой из них будет работать, и один из преимуществ с этой структурой, если Арби решил заменить говядину Классический Жаркое (о нет!) С Ростбифом Max (о да!), Вы можете просто изменить имя компонента, не затрагивая другие данные

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

Удивительно, большое спасибо! –

+0

@JoeSloan Дайте этой структуре попробовать - это общий шаблон дизайна для Firebase. Если это поможет, пожалуйста, примите мой ответ! – Jay

+0

Привет, Джей, не могли бы вы объяснить разницу между вашим ответом и Эйриком Бернценом внизу? Мне удалось получить массив, в котором я нуждался, используя его ответ, но, может быть, есть преимущество в том, чтобы на самом деле перестроить базу данных так, как вы предлагали? –

0

Я новичок в этом сам & в то время как вся огнь база вещь блестящая, учебники были немного расплывчатыми для меня. Динозавры rah rah и т. Д. Во всяком случае, после того, как вы потратили время, сражаясь с массивами, чтобы заполнить таблицы, я начинаю это получать. А может и нет? Не знаю. Но довольно уверен, что вы можете просто получить ключи, наблюдая тип события childAdded, а затем snapshot.value, который дает вам весь malark для итерации и snapshot.key, который дает вам отдельные ключи по одному за раз: var boink = snapshot.key MyboinkArray.append (boink)

+0

https://www.udacity.com/course/firebase-essentials-for-android--ud009 возможно, это помогает – Alexis