2017-02-07 5 views
1

abzurufen Ich ging ein Risiko, Firebase für mein Abschlussprojekt zu verwenden. Ich kann meine Daten nicht von der Firebase-Datenbank abrufen. Ich habe keine Ahnung, wo ich falsch liege. Bitte erleuchte mich.Nicht möglich, Daten von JSON in Firebase Database Swift

Hauptdatei:

var ref: FIRDatabaseReference! 
let user = FIRAuth.auth()?.currentUser 

@IBOutlet var placename: UILabel! 
@IBOutlet var placetype: UILabel! 

var SiasuObj = [siasuObj]() 
var PlaceObj = [placeObj]() 

var planPriceLevel = "" 

override func viewDidLoad() { 
    super.viewDidLoad() 

    fetchData() 

    findPlaceToEat() 
} 

func fetchData(){ 

    //var planPriceLevel = "" 
    ref = FIRDatabase.database().reference() 

    //I can't pass through this part 

ref.child("ios_entry").child(user!.uid).child("Budget").observeEventType(.ChildAdded, withBlock: { 
     (snapshot) in 

     if let dictionary = snapshot.value as? [String: AnyObject]{ 
      let SiasuObj = siasuObj() 
      SiasuObj.setValuesForKeysWithDictionary(dictionary) 
      self.SiasuObj.append(SiasuObj) 
      print("Total budget") 
      print(SiasuObj.total_budget, SiasuObj.total_day, SiasuObj.total_pax) 
      SiasuObj.total_budget = dictionary ["total_budget"] as! String 
      SiasuObj.total_day = dictionary["total_day"] as! String 
      SiasuObj.total_pax = dictionary["total_pax"] as! String 

      let total_budget:Int32? = Int32(SiasuObj.total_budget); 
      print(total_budget) 
      let total_day:Int32? = Int32(SiasuObj.total_day); 
      print(total_day) 
      let total_pax:Int32? = Int32(SiasuObj.total_pax); 
      print(total_pax) 

      let budgetPerPax = (total_budget!/total_pax!)/(total_day! * 3); 

      if(budgetPerPax < 50){ 
       self.planPriceLevel = "1"; 
       self.findPlaceToEat(); 
      }else if(budgetPerPax <= 150){ 
       self.planPriceLevel = "2"; 
       self.findPlaceToEat(); 
      }else if(budgetPerPax > 150){ 
       self.planPriceLevel = "3"; 
       self.findPlaceToEat(); 
      } 
     } 

     }, withCancelBlock: nil) 
} 

func findPlaceToEat(){ 
    print("inside findPlaceToEat()") 

    print("Plan price level") 
    print(planPriceLevel) 
    //let pricelevel = String(planPriceLevel) 
    // print("pricelevel") 
    //print(pricelevel) 

    ref.child("places_detail").child("price_level").child(planPriceLevel).childByAutoId().observeEventType(.ChildAdded, withBlock:{ 
     (snapshot) in 
     if let dictionary = snapshot.value as? [String: AnyObject]{ 
      let PlaceObj = placeObj() 
      //placeObj.setValuesForKeysWithDictionary(dictionary) 

      //self.PlaceObj.append(PlaceObj) 
      print("Whatever") 
      print(PlaceObj.place_name, PlaceObj.place_type) 
      PlaceObj.place_name = dictionary["place_name"] as! String 
      PlaceObj.place_type = dictionary["place_type"] as! String 
      PlaceObj.price_range = dictionary["price_range"] as! String 
      PlaceObj.vegan_type = dictionary["vegan_type"] as! String 
      PlaceObj.website = dictionary["website"] as! String 



      self.placename.text = PlaceObj.place_name; 


     } 
    }, withCancelBlock: nil) 
} 

Class-Datei:

class placeObj: NSObject { 

var place_name : String! 
var place_type : String! 
var price_range : String! 
var vegan_type : String! 
var website : String! 
} 
+2

können Sie bitte Ihre firebase Struktur posten? –

Antwort

1

Ändern Sie diese Zeile

ref.child("places_detail").child("price_level").child(planPriceLevel).childByAutoId().observeEventType(.ChildAdded, withBlock:{ 
    (snapshot) in 

dazu:

ref.child("places_detail").child("price_level").child(planPriceLevel).childByAutoId().observeEventType(.Value, withBlock:{ 
    (snapshot) in 

ObserveEvent Typ ist .ChildAdded gibt Ihnen nur Informationen, wenn neue Kind hinzugefügt wird. Verwenden Sie daher . Wert

Eine weitere wichtige Sache zu überprüfen ist Referenz-URL. Überprüfen Sie, ob Sie die richtige Basis-URL in Google-Info.plist oder nicht haben

2

Statt .observeEventType(.ChildAdded) zu verwenden, verwenden .value wie es Kind nur hinzugefügt werden Daten abrufen, wenn neuer Eintrag hinzugefügt wurde, um Feuerbasis.

Um Daten auf einem Pfad zu lesen und für Änderungen hören, verwenden Sie die observeEventType:withBlock oder observeSingleEventOfType:withBlock Methoden der FIRDatabaseReferenceFIRDataEventTypeValue Ereignisse zu beobachten.

FIRDataEventTypeValue: Lesen und warten auf Änderungen am gesamten Inhalt eines Pfades.

Firebase Dokumentation sagt: Sie haben das FIRDataEventTypeValue Ereignis verwenden können, um die Daten zu einem bestimmten Pfad zu lesen, da es zum Zeitpunkt des Ereignisses vorhanden ist. Diese Methode wird einmal ausgelöst, wenn der Listener angeschlossen ist und jedes Mal, wenn sich die Daten ändern, einschließlich aller untergeordneten Werte . Dem Ereignisrückruf wird ein Snapshot übergeben, der alle Daten an diesem Speicherort enthält, einschließlich untergeordnete Daten. Wenn keine Daten vorhanden sind, ist der Wert des zurückgegebenen Snapshots gleich Null.