2016-04-27 7 views
0

ich eine Datenbank haben, die etwa wie folgt aussieht:eine Reihe von Kindern in Firebase Abrufen von mit Swift

Firebase
  Restaurants
    McDonalds
      Menüpunkt 1: Burger
      Menüpunkt 2: Pommes
    Menüpunkt 3: trinken
    KFC
      Menüpunkt 1: Huhn
      Menüpunkt 2: Kartoffelbrei
      Menüpunkt 3: trinken
    Taco Bell
      Menüpunkt 1: Taco
    Menüpunkt 2: Burrito
      Menüpunkt 3: trinken

Wie kann ich eine Liste nur der Restaurant-Namen (Array oder Wörterbuch ist in Ordnung), ohne ihre jeweiligen Menüpunkte abrufen?

der Ausgang würde im Idealfall aussehen wie ["McDonalds", "KFC", "Taco Bell"], mit einem zugänglichen Index oder Schlüssel.

+0

Es gibt Antworten, aber die Quintessenz ist, können Sie nicht. Firebase gibt immer Schlüssel: Wert-Paare zurück. Sie werden Probleme mit Ihrer Firebase-Datenstruktur bekommen - siehe meine alternative Antwort. – Jay

Antwort

1

Man könnte so etwas wie tun:

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 wird das Array haben Sie gefragt. Sie erhalten immer noch die kompletten Restaurantobjekte von Firebase, aber nur mit ihren Schlüsseln (Namen).

+0

Oh man, das ist so nah dran an dem, was ich schon hatte, danke! –

+0

Nur hinzugefügt, es tut was ich brauche es perfekt zu tun, danke! –

0

Sie können dies unter der approch getan: -

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

ich die Daten als statische Daten verwendet haben, alle müssen Sie die Daten ersetzen, die Sie aus Backend recieving.

Hoffe, das funktioniert für Sie.

2

Die Antwort ist, Sie können nicht nur Schlüssel zurückgeben. Die Struktur in Ihrer Frage kann einige Herausforderungen auf der Straße darstellen, da zwischen den Textdaten und den Knotennamen zu viel Verbindung besteht.

Hier ist eine optionale Struktur, die alles für einfache Abfrage trennt.

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 

und dann die Namen

restaurant_names 
    restaurant_name_0: McDonalds 
    restaurant_name_1: Arby's 

Mit dieser Struktur, um die String-Daten von den Knoten zu trennen, die die Daten enthalten, die Sie leicht abfragen für alle Restaurant Namen aus dem restaurent_name Knoten ermöglicht. Sie können auch fragen, für welche Restaurants ein Burger auf der Speisekarte steht. Finden Sie sogar diejenigen, die einen Milchshake anbieten.

Ich könnte sogar vorschlagen, das Menü zu brechen, um die Daten weiter zu reduzieren.

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

Beides wird funktionieren und einer der Vorteile, die mit dieser Struktur ist, wenn Arby beschlossen, das Roast Beef Classic (oh nein!) Mit dem Roastbeef Max (oh ja!) Zu ersetzen, können Sie einfach das ändern Name Komponente ohne andere Daten zu beeinflussen

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

Super, vielen Dank! –

+0

@JoeSloan Geben Sie dieser Struktur einen Versuch - es ist ein allgemeines Entwurfsmuster für Firebase. Wenn es hilft, bitte akzeptiere meine Antwort! – Jay

+0

Hi Jay, kannst du den Unterschied zwischen deiner Antwort und Eirik Berntsen unten erklären? Ich war in der Lage, das Array, das ich brauchte, mit seiner Antwort zu bekommen, aber vielleicht ist es ein Vorteil, die Datenbank tatsächlich so zu strukturieren, wie Sie es vorgeschlagen haben. –

0

ich bin neu in diesem selbst & während der ganzen Feuer Basis Sache brillant, waren die Übungen ein wenig vage für mich. Dinosaurier rah rah usw. Wie auch immer, nachdem ich Jahre damit verbracht habe, mit Arrays zu hantieren, um Tableviews zu bevölkern, fange ich an, es zu verstehen. Oder vielleicht nicht? Keine Ahnung. Aber ziemlich sicher, dass Sie nur die Schlüssel bekommen, indem Sie den Ereignistyp childAdded und dann snapshot.value beobachten, wodurch Sie den gesamten Malark durchlaufen und snapshot.key, der Ihnen die einzelnen Schlüssel nacheinander gibt: var boink = snapshot.key MyboinkArray.append (boink)

+0

https://www.udacity.com/course/firebase-essentials-for-android--ud009 vielleicht hilft dies – Alexis

Verwandte Themen