2013-02-19 10 views
108

Ich versuche, eine Anwendung zu erstellen, wo ich Daten in bestimmten Benutzerkonten abrufen/festlegen kann und ich von Firebase versucht wurde.Holen Sie Benutzer nach Name Eigenschaft mit Firebase

Das Problem, das ich habe ist, dass ich weiß nicht, wie bestimmte Benutzer Daten zum Ziel, wenn meine Struktur sieht wie folgt aus:

My data structure described by the text below.

online-b-cards 
    - users 
    - InnROTBVv6FznK81k3m 
     - email: "[email protected]" 
     - main: "Hello world this is a text" 
     - name: "Alex" 
     - phone: 12912912 

Ich habe umsah und ich kann Ich finde wirklich nichts darüber, wie man auf individuelle Daten zugreifen kann, geschweige denn, wenn sie einen zufälligen Hash als ID bekommen.

Wie würde ich einzelne Benutzerinformationen anhand ihres Namens erfassen? Wenn es einen besseren Weg gibt, bitte sag es mir!

+0

versuchen Sie dies: http://stackoverflow.com/questions/32886546/how-to-get-all-child-list-from-firebase-android/36600791#36600791 –

Antwort

133

Zuvor Firebase erforderlich Sie Ihre eigene Indizes oder Download zu generieren alle Daten an einer Stelle, Elemente zu finden und abzurufen, die einige Kind Attribut angepasst (zum Beispiel alle Benutzer mit name === "Alex").

Im Oktober 2014 hat Firebase neue Abfragefunktionen über die Methode orderByChild() eingeführt, mit der Sie diese Art von Abfrage schnell und effizient durchführen können. Siehe die aktualisierte Antwort unten.

Beim Schreiben von Daten in Firebase stehen Ihnen verschiedene Optionen zur Verfügung, die verschiedene Anwendungsfälle widerspiegeln. Auf einem hohen Niveau, ist Firebase eine Baumstruktur NoSQL-Datenspeicher und bietet ein paar einfache Grundelemente für die Listen der Datenverwaltung:

  1. schreiben mit einem einzigartigen, bekannten Schlüssel zur Feuerbasis:

    ref.child('users').child('123').set({ "first_name": "rob", "age": 28 }) 
    
  2. anfügen auf Listen mit einem automatisch generierten Schlüssel, der automatisch sortieren geschrieben von Zeit:

    ref.child('users').push({ "first_name": "rob", "age": 28 }) 
    
  3. Hören für Änderungen in Daten durch seinen einzigartigen, bekannt Pfad:

    ref.child('users').child('123').on('value', function(snapshot) { ... }) 
    
  4. Filter oder um Daten in einer Liste von Schlüsseln oder Attributwert:

    // Get the last 10 users, ordered by key 
    ref.child('users').orderByKey().limitToLast(10).on('child_added', ...) 
    
    // Get all users whose age is >= 25 
    ref.child('users').orderByChild('age').startAt(25).on('child_added', ...) 
    

Mit t Der Zusatz von orderByChild(), Sie müssen nicht mehr Ihren eigenen Index für Abfragen auf Kind-Attribute erstellen! Um zum Beispiel alle Benutzer mit dem Namen "Alex" abzurufen:

ref.child('users').orderByChild('name').equalTo('Alex').on('child_added', ...) 

Engineer bei Firebase hier. Beim Schreiben von Daten in Firebase stehen Ihnen verschiedene Optionen zur Verfügung, die verschiedene Anwendungsfälle widerspiegeln.Da Firebase ein NoSQL-Datenspeicher ist, müssen Sie Ihre Datenobjekte entweder mit eindeutigen Schlüsseln speichern, damit Sie direkt auf dieses Element zugreifen können, oder alle Daten an einem bestimmten Speicherort laden und jedes Element durchlaufen, um den gesuchten Knoten zu finden zum. Weitere Informationen finden Sie unter Writing Data und Managing Lists.

Wenn Sie schreiben Daten in Firebase, können Sie entweder set Daten einen eindeutigen definierten Pfad (dh a/b/c), oder push Daten in eine Liste, die eine eindeutige ID generieren (dh a/b/<unique-id>) und ermöglicht es Ihnen, zu sortieren und zu Abfrage der Elemente in dieser Liste nach Zeit. Die eindeutige ID, die Sie oben sehen, wird generiert, indem Sie push aufrufen, um ein Element an die Liste um online-b-cards/users anzufügen.

Anstatt hier push zu verwenden, würde ich empfehlen, set zu verwenden und die Daten für jeden Benutzer mit einem eindeutigen Schlüssel wie der E-Mail-Adresse des Benutzers zu speichern. Dann können Sie direkt auf die Daten des Benutzers zugreifen, indem Sie über das Firebase JS SDK zu online-b-cards/users/<email> navigieren. Zum Beispiel:

function escapeEmailAddress(email) { 
    if (!email) return false 

    // Replace '.' (not allowed in a Firebase key) with ',' (not allowed in an email address) 
    email = email.toLowerCase(); 
    email = email.replace(/\./g, ','); 
    return email; 
} 

var usersRef = new Firebase('https://online-b-cards.firebaseio.com/users'); 
var myUser = usersRef.child(escapeEmailAddress('[email protected]')) 
myUser.set({ email: '[email protected]', name: 'Alex', phone: 12912912 }); 

Beachten Sie, dass seit Firebase bestimmte Zeichen in den Referenzen nicht erlaubt (siehe Creating References), wir die . und ersetzen sie durch eine , in dem obigen Code entfernen.

+2

Perfekt! Danke für die Antwort Rob. Liebevolle Feuerbasis! –

+0

Was ich nicht bekomme, ist, wenn Sie eine Abfrage durchführen, erhalten Sie ein Objekt, das die ID als Eigenschaft hat, in diesem Fall die entgangene E-Mail, wobei der Wert das von Ihnen festgelegte Objekt ist. Natürlich, wenn du eine Liste liest, kennst du die ID nicht, also ... wie solltest du die Daten lesen? – Sam

+0

@Sam Ich verstehe Ihre Frage nicht vollständig, aber wenn Sie eine separate Frage mit einigen Beispielcode und erklären Sie Ihren Anwendungsfall, ich bin glücklich, zu helfen. –

2

Dies war eine Paraphrasierung eines Beitrags, der mir beim Versuch, auf die automatisch generierte eindeutige ID zuzugreifen, geholfen hat. Access Firebase unique ids within ng-repeat using angularFire implicit sync

Danke, bennlich (Quelle):

Firebase verhält sich wie ein normales Javascript-Objekt. Vielleicht kann das folgende Beispiel Sie auf die richtige Spur bringen.

<div ng-repeat="(name, user) in users"> 
    <a href="" ng-href="#/{{name}}">{{user.main}}</a> 
</div> 

Edit: Nicht 100% sicher, dass Ihr gewünschtes Ergebnis, aber hier ist ein bisschen mehr, das einen ‚Aha‘ Moment könnte funken. Klicken Sie in Ihrem Firebase-Dashboard rechts auf den Schlüssel, auf den Sie zugreifen möchten. Von dort können Sie so etwas wie verwenden:

var ref = new Firebase("https://online-b-cards.firebaseio.com/users/<userId>/name); 
    ref.once('value', function(snapshot) { 
     $scope.variable= snapshot.val(); 
}); 
+0

Hallo Anthony, vielen Dank für die Information bezüglich der REST-Struktur (?) Und es hat definitiv einen 'Aha' gemacht. Im Rückblick auf diesen Beitrag ist es für mich jetzt klar, dass ich meine Daten auf eine etwas peinliche Weise strukturiert habe, danke für die Tipps, und ich werde es für mein nächstes Firebase-basiertes Projekt im Hinterkopf behalten! –

4

Ich denke, der beste Ansatz, um die IDs des Benutzers o des Auth Objekt durch die Firebase zur Verfügung gestellt Basis zu definieren ist. Wenn ich meine Benutzer erstellen, das tue ich:

FirebaseRef.child('users').child(id).set(userData); 

Diese ID stammt aus:

var ref = new Firebase(FIREBASE); 
var auth = $firebaseAuth(ref); 
auth.$authWithOAuthPopup("facebook", {scope: permissions}).then(function(authData) { 
    var userData = {}; //something that also comes from authData 
    Auth.register(authData.uid, userData); 
}, function(error) { 
    alert(error); 
}); 

Die Dienste Auth Firebase wird immer eine eindeutige ID unter allen ihren Anbietern gewährleisten bei uid eingestellt werden. Auf diese Weise immer finden Sie die auth.uid haben und den gewünschten Benutzer leicht zugänglich machen können, sie zu aktualisieren, wie:

FirebaseRef.child('users').child(id).child('name').set('Jon Snow'); 
4

Sie die Details durch den folgenden Code greifen kann.

FirebaseDatabase database = FirebaseDatabase.getInstance(); 
DatabaseReference myRef = database.getReference("users"); 
myRef.orderByChild("name").equalTo("Alex").addListenerForSingleValueEvent(new ValueEventListener() {   
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 

        for (DataSnapshot childDataSnapshot : dataSnapshot.getChildren()) { 
         Log.d(TAG, "PARENT: "+ childDataSnapshot.getKey()); 
         Log.d(TAG,""+ childDataSnapshot.child("name").getValue()); 
        } 
1

Dies ist, wie die automatische eindeutige Schlüssel in Firebase erzeugt zuzugreifen: Datenstruktur: - OnlineBcards - UniqueKey

database.ref().on("value", function(snapshot) { 
     // storing the snapshot.val() in a variable for convenience 
     var sv = snapshot.val(); 
     console.log("sv " + sv); //returns [obj obj] 

     // Getting an array of each key in the snapshot object 
     var svArr = Object.keys(sv); 
     console.log("svArr " + svArr); // [key1, key2, ..., keyn] 
     // Console.log name of first key 
     console.log(svArr[0].name); 
}, function(errorObject) { 
    console.log("Errors handled: " + errorObject.code); 
}); 
0

Der einfachste und besserer Weg, eindeutige ID in dem ur Datenbank gemäß authentifiziertem Benutzer ist dies:

private FirebaseAuth auth; 

String UId=auth.getCurrentUser().getUid(); 

FirebaseDatabase database = FirebaseDatabase.getInstance(); 
DatabaseReference myRef = database.getReference("Users"); 

User user = new User(name,email,phone,address,dob,bloodgroup); 

myRef.child(UId).setValue(user); 

Die UId wird eine eindeutige Kennung für einen bestimmten authentifizierten E-Mail/Benutzer seine

+3

Das geht nicht auf die Frage ein. Die Frage war, wie Daten in bestimmten Benutzerkonten abgerufen und festgelegt werden. Ihr Code erstellt ein Benutzerkonto und ist eigentlich nicht gültig, da Sie .setValue (Benutzer) nicht haben können, weil * user * kein gültiger Parameter ist. – Jay

0

Der einfachste Weg ist es, die .push(){}

Funktion mehr zu verwenden, die diese zufälligen Schlüssel generieren. Verwenden Sie stattdessen die .update(){}-Funktion, in der Sie den Namen des untergeordneten Elements angeben können, anstatt den zufälligen Schlüssel zu verwenden.

Verwandte Themen