Holen Sie sich Benutzer mit Firebase nach Namenseigenschaften


129

Ich versuche, eine Anwendung zu erstellen, mit der ich Daten in bestimmten Benutzerkonten abrufen / festlegen kann, und ich wurde von Firebase in Versuchung geführt.

Das Problem, das ich habe, ist, dass ich nicht weiß, wie ich auf bestimmte Benutzerdaten abzielen soll, wenn meine Struktur so aussieht:

Meine Datenstruktur wird im folgenden Text beschrieben.

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

Ich habe mich umgesehen und kann nichts darüber finden, wie ich auf einzelne Daten zugreifen kann, geschweige denn, wenn sie einen zufälligen Hash als ID erhalten.

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


Antworten:


156

Bisher mussten Sie in Firebase Ihre eigenen Indizes erstellen oder alle Daten an einem Speicherort herunterladen, um Elemente zu finden und abzurufen, die mit einem untergeordneten Attribut übereinstimmen (z. B. alle Benutzer mit name === "Alex").

Im Oktober 2014 hat Firebase über die orderByChild()Methode neue Abfragefunktionen eingeführt, mit denen 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 unterschiedliche Anwendungsfälle widerspiegeln. Auf hoher Ebene ist Firebase ein NoSQL-Datenspeicher mit Baumstruktur und bietet einige einfache Grundelemente für die Verwaltung von Datenlisten:

  1. Schreiben Sie mit einem eindeutigen, bekannten Schlüssel an Firebase:

    ref.child('users').child('123').set({ "first_name": "rob", "age": 28 })
    
  2. An Listen mit einem automatisch generierten Schlüssel anhängen , der automatisch nach der geschriebenen Zeit sortiert wird:

    ref.child('users').push({ "first_name": "rob", "age": 28 })
    
  3. Achten Sie auf Änderungen an Daten über den eindeutigen, bekannten Pfad:

    ref.child('users').child('123').on('value', function(snapshot) { ... })
    
  4. Filtern oder bestellen Sie Daten in einer Liste nach Schlüssel- 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 dem Zusatz von orderByChild()müssen Sie keinen eigenen Index mehr für Abfragen zu untergeordneten Attributen erstellen! So rufen Sie beispielsweise alle Benutzer mit dem Namen "Alex" ab:

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

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

Wenn Sie Daten in Firebase schreiben, können Sie entweder setDaten unter Verwendung eines eindeutigen, definierten Pfads (dh a/b/c) oder pushDaten in eine Liste eingeben, wodurch eine eindeutige ID (dh a/b/<unique-id>) generiert wird und Sie die Elemente in dieser Liste nach Zeit sortieren und abfragen können . Die oben angezeigte eindeutige ID wird durch Aufrufen generiert, pushum ein Element an die Liste unter anzuhängen online-b-cards/users.

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

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('hello@hello.com')) 
myUser.set({ email: 'hello@hello.com', name: 'Alex', phone: 12912912 });

Da Firebase bestimmte Zeichen in Referenzen nicht zulässt (siehe Erstellen von Referenzen ), entfernen wir diese .und ersetzen sie durch a ,im obigen Code.


1
@RobDiMarco Haben Sie eine Antwort auf die unten stehende Frage von Stephen?
Charles Han

2
Hey @RobDiMarco. Ihr Vorschlag, E-Mail-Adressen als Grundlage für die ID zu verwenden, ist zwar noch gültig, es kann sich jedoch lohnen, Ihre Antwort zu erweitern, um auf die neue orderByChildFunktion zu verweisen . Da diese Antwort häufig als relevante / verwandte Antwort angezeigt wird, müssen sich die Benutzer diese unbedingt ansehen und sollten sich der neuen Abfragefunktionen bewusst sein.
Frank van Puffelen

1
@FrankvanPuffelen Tolle Idee - danke für den Hinweis. Ich werde dies heute aktualisieren.
Rob DiMarco

1
@Ced Leider kann ich nicht kommentieren, was in Arbeit ist. Ich verspreche, dass wir hart arbeiten (das war schon immer so), aber keine genauen Angaben machen können. Die Datenbank-API ist in gewisser Weise in der Tat restriktiv, und wir tun dies absichtlich, um nur Methoden bereitzustellen, für die wir bestimmte Leistungsniveaus garantieren können. Aus diesem Grund stellen wir keine Methode zur Verfügung, mit der beispielsweise eine Operation über eine gesamte Liste ausgeführt werden kann. Fairer Punkt in den Dokumenten für fortgeschrittene Benutzer. Versuchen Sie im Zweifelsfall unsere Google-Gruppe für detaillierte Gespräche: groups.google.com/forum/#!forum/firebase-talk Das Team ist hier sehr aktiv!
Rob DiMarco

1
@RobDiMarco Das ist wunderbar zu hören. Ich habe gestern Firebase-Funktionen gesehen und war den ganzen Tag begeistert, weil ich dachte, Firebase sei ein Game Changer und kurz davor, das Back-End zu revolutionieren. Im Ernst, ich könnte jemandem beibringen, der noch nie in seinem Leben programmiert hat, ein Backend auf Firebase zu unterhalten. Das ist ziemlich erstaunlich und ziemlich beängstigend. Prost
Ced

5

Sie können die Details mit dem folgenden Code abrufen.

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

4

Ich denke, der beste Ansatz besteht darin, die IDs der Benutzer basierend auf dem von der Firebase bereitgestellten Auth-Objekt zu definieren. Wenn ich meine Benutzer erstelle, mache ich Folgendes:

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

Diese ID stammt von:

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 Firebase-Authentifizierungsdienste stellen immer sicher, dass unter allen Anbietern eine eindeutige ID für uid festgelegt wird. Auf diese Weise haben Sie immer die auth.uid und können leicht auf den gewünschten Benutzer zugreifen, um sie zu aktualisieren, wie zum Beispiel:

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

2

Dies war eine Umschreibung eines Beitrags, der mir beim Zugriff auf die automatisch generierte eindeutige ID geholfen hat. Greifen Sie mithilfe der impliziten AngularFire-Synchronisierung innerhalb von ng-repeat auf eindeutige Firebase-IDs zu

Danke, bennlich (Quelle):

Firebase verhält sich wie ein normales Javascript-Objekt. Vielleicht bringt Sie das folgende Beispiel auf den richtigen Weg.

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

Bearbeiten: Nicht 100% sicher über Ihr gewünschtes Ergebnis, aber hier ist ein bisschen mehr, das einen Aha-Moment auslösen könnte. Klicken Sie auf den Schlüssel, auf den Sie zugreifen möchten, direkt in Ihrem Firebase-Dashboard. Von dort aus können Sie etwas verwenden wie:

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

Hallo Anthony, danke für die Informationen bezüglich der REST-Struktur (?) Und es hat definitiv ein 'Aha' ausgelöst. Wenn ich auf diesen Beitrag zurückblicke, ist mir jetzt klar, dass ich meine Daten etwas umständlich strukturiert habe. Vielen Dank für die Tipps und ich werde sie für mein nächstes Firebase-basiertes Projekt berücksichtigen!
Richard Bamford

2

So greifen Sie auf die automatisch generierten eindeutigen Schlüssel in Firebase zu: 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);
});

1

Der einfachste Weg ist, die Verwendung von zu beenden .push(){}

Funktion, die diesen zufälligen Schlüssel erzeugt. Verwenden .update(){}Sie stattdessen die Funktion, mit der Sie den Namen des Kindes angeben können, anstatt den Zufallsschlüssel zu haben.


1

Daten abrufen:

In Ihrer Datenbank verwenden Sie eine zufällige ID, die mit der generiert push()wird. Wenn Sie also die Daten abrufen möchten, gehen Sie wie folgt vor:

Verwenden von Firebase in der Android App:

DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child("users");
ref.addListenerForSingleValueEvent(new ValueEventListener() {           
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                for (DataSnapshot datas : dataSnapshot.getChildren()) {
                    String name=datas.child("name").getValue().toString();
                }
             }

            @Override
           public void onCancelled(DatabaseError databaseError) {
          }
     });

Verwenden von Firebase in Javascript:

  firebase.database().ref().child("users").on('value', function (snapshot) {
   snapshot.forEach(function(childSnapshot) {
    var name=childSnapshot.val().name;
  });
});

Hier haben Sie den Schnappschuss (Speicherort der Daten), usersdann durchlaufen Sie alle zufälligen IDs und rufen die Namen ab.


Abrufen von Daten für einen bestimmten Benutzer:

Wenn Sie nun Informationen nur für einen bestimmten Benutzer abrufen möchten, müssen Sie eine Abfrage hinzufügen:

Verwenden von Firebase in der Android App:

DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child("users");
Query queries=ref.orderByChild("name").equalTo("Alex");
queries.addListenerForSingleValueEvent(new ValueEventListener() {...}

Verwenden von Firebase mit Javascript

firebase.database().ref().child("users").orderByChild("name").equalTo("Alex").on('value', function (snapshot) {
   snapshot.forEach(function(childSnapshot) {
      var name=childSnapshot.val().name;
   });
});

Das Verwenden orderByChild("name").equalTo("Alex")ist wie gesagt where name="Alex", es werden die Daten abgerufen, die sich auf Alex beziehen.


Bester Weg:

Das Beste ist, die Firebase-Authentifizierung zu verwenden, um für jeden Benutzer eine eindeutige ID zu generieren und diese anstelle einer zufälligen ID zu verwenden push(). Auf diese Weise müssen Sie nicht alle Benutzer durchlaufen, da Sie über die ID verfügen und problemlos darauf zugreifen können.

Zuerst muss der Benutzer angemeldet sein, dann können Sie die eindeutige ID abrufen und einen Listener anhängen, um die anderen Daten dieses Benutzers abzurufen:

Verwenden von Firebase mit Android:

DatabaseReference ref = FirebaseDatabase.getInstance().getReference("users");
String uid = FirebaseAuthentication.getInstance().getCurrentUser().getUid();

ref.child(uid).addListenerForSingleValueEvent(new ValueEventListener() {
          @Override
         public void onDataChange(DataSnapshot dataSnapshot) { 
           String name=dataSnapshot.child("name").getValue().toString(); 
   }
         @Override
       public void onCancelled(DatabaseError databaseError) {
      }
 });

Verwenden von Firebase mit Javascript:

    var user = firebase.auth().currentUser;
    var uid=user.uid;

    firebase.database().ref().child("users").child(uid).on('value', function (snapshot) {
     var name=snapshot.val().name;
   });
 

0

Der einfachste und bessere Weg, Ihrer Datenbank je nach authentifiziertem Benutzer eine eindeutige ID hinzuzufügen, ist folgende:

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 ist eine eindeutige ID für eine bestimmte authentifizierte E-Mail / einen bestimmten authentifizierten Benutzer


3
Damit ist die Frage nicht beantwortet. Die Frage war, wie Daten in bestimmten Benutzerkonten abgerufen und festgelegt werden. Ihr Code erstellt ein Benutzerkonto und ist tatsächlich nicht gültig, da Sie nicht .setValue (Benutzer) können, da Benutzer kein gültiger Parameter ist.
Jay
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.