2016-09-17 3 views
0

Ich habe eine firebase Struktur, die wie folgt aussieht: enter image description hereEmpfangen von Firebase AutoID in Tableviewcontroller

Der blaue heißt feedPosts, die grüne ist die userId, das eine ohne Farbe ist die AutoID Feuerbasis schafft Daten zum Anhängen und die Orange sagt Inhalt: "Benutzer Post String ist hier".

Mein Problem ist, dass ich nicht weiß, wie man die firebase autoId bekommt, so dass ich zeigen kann, was der Benutzer in meinem tableViewController gepostet habe. Ich muss Daten an die userId anhängen, so dass der Benutzer mehrere Beiträge veröffentlichen kann - ich weiß einfach nicht, wie man den Schlüssel in einem tableViewController bekommt. Hilf mir?

+0

Wissen Sie im Voraus, was in dieser AutoID ist? Sonst wäre es dumm, die gesamten Daten abzurufen, die AutoID zu durchlaufen und einen einzelnen Datenknoten abzurufen. – Dravidian

+0

Nein Ich weiß nicht im Voraus, was die AutoID ist. Können Sie mir ein Beispiel geben, mit dem ich arbeiten kann? –

Antwort

0

Wenn Ihr JSON ist so etwas wie folgt aus: -

foodItems{ 
     uid1 :{ 
      autoID1 :{ 
       content : "This is a String" 
     } 
     } 
    } 

AutoID abzurufen, die enthält die content : "This is a String"

Swift 2,3

let parentRef = FIRDatabase.database().reference().child("foodItems/\(FIRAuth().auth()!.currentUser!.uid)").queryOrderedByChild("content").queryEqualToValue("This is a String") 

    parentRef.observeSingleEventOfType(.Value, withBlock:{(snap) in 

     if let snapContainingContent = snap.value as? [String:AnyObject]{ 

     for each in snapContainingContent{ 
      print(each.0)//your autoID 
      print(each.1)//your content String 
      if let autoDict = each.1 as? NSDictionary{ 

        print(autoDict["content"]!) 
        print(autoDict.allKeys(for: "This is a String")[0]) 


       } 
      } 

     } 

}) 

Swift 3

let parentRef = FIRDatabase.database().reference().child("Posts/foodItems/uid1").queryOrdered(byChild: "content").queryEqual(toValue: "This is a String") 

    parentRef.observeSingleEvent(of: .value, with:{(snap) in 

     if let snapContainingContent = snap.value as? [String:AnyObject]{ 

      for each in snapContainingContent{ 
       print(each.0)//your autoID 
       print(each.1)//your content String 
       if let autoDict = each.1 as? NSDictionary{ 

        print(autoDict["content"]!) 
        print(autoDict.allKeys(for: "This is a String")[0]) 
       } 

      } 

     } 

    }) 
+0

Aber das würde mir nur diesen bestimmten Teil des Codes zeigen? Ich möchte den gesamten Inhalt anzeigen: "mit String" - ist das nicht möglich? –

+0

Ich habe meine Antwort bearbeitet ... Das ist das Beste, was du mit AutoIDs bekommst. Alternative wäre, den gesamten Knoten zu durchlaufen, um nach einem bestimmten Inhalt in diesem Kindknoten zu suchen:) Happy Coding – Dravidian

1

Die einfachste Lösung besteht darin, Ihre Struktur so zu ändern, dass sie den Daten entspricht, die Sie erhalten möchten. Hier ist, was Sie haben jetzt

feedPosts 
    -fbUserId0 
    -autoIdForThisPost1 
     content: "users post string is here" 
    -fbUserId1 
    -autoIdForThisPost1 
     content: "users post string is here" 

ändern, um es dieser

feedPosts 
    -autoIdForThisPost0 
     post_by_uid: "-fbUserId0" 
     content: "users post string is here" 
    -autoIdForThisPost1 
     post_by_uid: "-fbUserId1" 
     content: "users post string is here" 

Dann können Sie für alle die Beiträge von -fbUserId1 abfragen. Dadurch wird jeder Post-Knoten, der den Inhalt enthält, sowie der Schlüssel des Posts, der die AutoId ist, zurückgegeben.

Dies ist auch erweiterbar, wie Sie zum Beispiel auch einen Zeitstempel über den Beitrag speichern können, oder vielleicht sogar, was post als Antwort darauf ist.

Ein weiterer Vorteil ist, dass es die gesamte Struktur flacher macht (flacher ist besser! Sehr wichtig in Firebase) und ist eher abfragbar.

+0

Ich werde versuchen, das zu tun - es klingt wie die beste Lösung! Wie frage ich nach der userId? –

+0

@ D.Finna Sehen Sie sich den Leitfaden [Daten abrufen] (https://firebase.google.com/docs/database/ios/retrieve-data) an und sehen Sie sich im Abschnitt Filterdaten den Suchbegriff queryEqualToValue an. – Jay

+0

Vielen Dank! Das hört sich nach etwas an, was ich benutzen könnte :-) Ich werde es mir definitiv ansehen! –

Verwandte Themen