2016-09-09 4 views
0

Frage haben --->Firebase, Swift: Suchen nur diejenigen `autoID` des Knotens, die einen bestimmten Schlüssel

  1. Gibt es eine Möglichkeit, einen Knoten, dessen Schlüssel ist ein autoID, die Might abrufen enthalten einen bestimmten Schlüssel. Wie in der unteren JSON-Struktur habe ich einen Kind-Knoten powers innerhalb einiger autoID 's, nicht alle von ihnen, ich möchte nur diejenigen Knoten abrufen, die Schlüssel powers in ihnen nicht wissen, was entsprechende value sein könnte.

  2. In der folgenden zwei vorgeschlagenen Ansatz, die man weniger Bandbreite verbrauchen würde?

Mein JSON Baum

node1 
    -node12 
    -autoId1 

     expo: "5122223333" 
     users: 
      -MqrvHRBTRcPzrvAOdkklBzeFW7E2 
       firstName: "Margery" 
       lastName: "Lady" 
    -autoId2 
     powers: "Triple3" 
     expo: "2123338983" 
     users: 
      -LqrsadaDs12BTRcPzrvABzeFW7E2 
       firstName: "Tyrion" 
       lastName: "Imph" 
    -node21 
    -autoId3 
     powers: "Triple" 
     expo: "5123333" 
     users: 
      -MqrvHRBTRcPzrvAOdkklBzeFW7E2 
       firstName: "Cersie" 
       lastName: "Lady" 
    -autoId4 
     powers: "Quad" 
     expo: "2128983" 
     users: 
      -LqrsadaDs12BTRcPzrvABzeFW7E2 
       firstName: "Sansa" 
       lastName: "Lady" 

Was habe ich versucht, --->

  • die gesamte node12 abrufen und dann, welche der AutoID Überprüfung ' s haben eine bestimmte key. für zB können Kräfte sagen: "Triple3"

    let prntRef = FIRDatabase.database().reference().child("node1").child("node12") 
    prntRef.observeSingleEventOfType(.Value, withBlock: {(snap) in 
    
        if snap.exists(){ 
    
        for each in snap.value as! [String:AnyObject]{ 
    
          prntRef.child(each.0 as! String).child("powers").observeSingleEventOfType(.Value, withBlock: {(IMsnap) in 
    
          if IMsnap.exists(){ 
    
           //Found The correct node 
           } 
          }) 
         } 
         }else{ 
    
         // 
         } 
        }) 
    
  • Meine andere alternative Lösung ist: -

    FIRDatabase.database().reference().child("node1").child("node12").queryOrderedByChild("powers").observeSingleEventOfType(.Value, withBlock: {(snap) in 
    
        if let snapDict = snap.value! as? [String : AnyObject]{ 
    
          print(snapDict.keys.first!) //Retrieving My AutoID .Nut this gives me entire node. 
    
         } 
    
         for each in snap.value as! [String:AnyObject]{ 
    
          print(each.0) //Retrieving My AutoID 
    
         } 
        }) 
    
    }) 
    

Hinweis: - ich etwas ähnlich Q gefunden in Firebase Forum gepostet, aber niemand scheint darauf zu antworten: - https://groups.google.com/forum/#!topic/firebase-talk/ZDHKwxRMiKQ

Antwort

2

Wenn Sie sich nicht um den Wert von powers kümmern, interessiert Sie nur, dass der Schlüssel existiert unter dem AutoId-Knoten, brauchen Sie nur .queryEqualToValue("") (dies ist abhängig von dem Wert des Schlüssel-Wert-Paares ist eine Zeichenfolge, für eine Zahl statt "" nur 0 [abhängig von Ihren Werten größer oder gleich 0 ]).

let ref = FIRDatabase.database().referenceWithPath("node1/node12") 

ref.queryOrderedByChild("powers") 
ref.queryEqualToValue("") 
ref.observeEventOfType(.Value, withBlock: { snap in 

    print(snap) // all the autoId nodes that have the powers key 
}) 
Verwandte Themen