Ottieni gli utenti per proprietà del nome utilizzando Firebase


129

Sto cercando di creare un'applicazione in cui posso ottenere / impostare dati in account di utenti specifici e sono stato tentato da Firebase.

Il problema che sto riscontrando è che non so come indirizzare i dati di utenti specifici quando la mia struttura è simile a questa:

La mia struttura di dati descritta dal testo seguente.

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

Mi sono guardato intorno e non riesco davvero a trovare nulla su come accedere ai singoli dati e tanto meno quando ricevono un hash casuale come loro ID.

Come farei per acquisire informazioni sui singoli utenti in base al loro nome? Se esiste un modo migliore per farlo, per favore dimmelo!


Risposte:


156

In precedenza, Firebase richiedeva di generare i propri indici o scaricare tutti i dati in una posizione per trovare e recuperare elementi che corrispondessero ad alcuni attributi figlio (ad esempio, tutti gli utenti con name === "Alex").

Nell'ottobre 2014, Firebase ha implementato la nuova funzionalità di query tramite il orderByChild()metodo, che consente di eseguire questo tipo di query in modo rapido ed efficiente. Vedi la risposta aggiornata di seguito.


Quando si scrivono dati su Firebase, sono disponibili alcune opzioni diverse che rispecchieranno diversi casi d'uso. Ad alto livello, Firebase è un archivio di dati NoSQL strutturato ad albero e fornisce alcune semplici primitive per la gestione di elenchi di dati:

  1. Scrivi a Firebase con una chiave unica e nota:

    ref.child('users').child('123').set({ "first_name": "rob", "age": 28 })
    
  2. Aggiungi agli elenchi con una chiave generata automaticamente che ordinerà automaticamente per ora scritta:

    ref.child('users').push({ "first_name": "rob", "age": 28 })
    
  3. Ascolta le modifiche ai dati tramite il suo percorso unico e noto:

    ref.child('users').child('123').on('value', function(snapshot) { ... })
    
  4. Filtra o ordina i dati in un elenco in base alla chiave o al valore dell'attributo :

    // 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', ...)
    

Con l'aggiunta di orderByChild(), non è più necessario creare il proprio indice per le query sugli attributi figlio! Ad esempio, per recuperare tutti gli utenti con il nome "Alex":

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

Ingegnere di Firebase qui. Quando si scrivono dati in Firebase, sono disponibili alcune opzioni diverse che riflettono i diversi casi d'uso dell'applicazione. Poiché Firebase è un archivio di dati NoSQL, dovrai archiviare i tuoi oggetti di dati con chiavi univoche in modo da poter accedere direttamente a quell'elemento o caricare tutti i dati in una determinata posizione e scorrere attraverso ciascun elemento per trovare il nodo che stai cercando . Vedere Scrittura dei dati e gestione degli elenchi per ulteriori informazioni.

Quando si scrivono dati in Firebase, è possibile utilizzare i setdati utilizzando un percorso univoco definito (ad es. a/b/c) Oppure pushdati in un elenco, che genererà un ID univoco (ad es. a/b/<unique-id>) E che consenta di ordinare e interrogare gli elementi in quell'elenco per volta . L'ID univoco visualizzato sopra viene generato chiamando pushper aggiungere un elemento all'elenco all'indirizzo online-b-cards/users.

Anziché utilizzare pushqui, consiglierei di utilizzare sete archiviare i dati per ciascun utente utilizzando una chiave univoca, come l'indirizzo e-mail dell'utente. Quindi è possibile accedere direttamente ai dati dell'utente navigando online-b-cards/users/<email>tramite Firebase JS SDK. Per esempio:

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

Si noti che poiché Firebase non consente determinati caratteri nei riferimenti (consultare la sezione Creazione di riferimenti ), rimuoviamo .e lo sostituiamo con a ,nel codice sopra.


1
@RobDiMarco Hai una risposta alla domanda posta di seguito da Stephen?
Charles Han,

2
Ehi @RobDiMarco. Sebbene il tuo suggerimento di utilizzare gli indirizzi e-mail come base per l'id sia ancora valido, potrebbe valere la pena espandere la tua risposta per puntare alla nuova orderByChildfunzionalità. Dato che questa risposta appare abbastanza spesso come una risposta pertinente / correlata, le persone sono tenute a guardarla e dovrebbero essere consapevoli delle nuove funzionalità della query.
Frank van Puffelen,

1
@FrankvanPuffelen Ottima idea - grazie per la nota. Lo aggiornerò oggi.
Rob DiMarco,

1
@Ced Purtroppo, non posso commentare cosa c'è nelle opere. Prometto che siamo al lavoro (è sempre stato vero), ma non posso dare dettagli. L'API del database è effettivamente restrittiva in alcuni modi e lo facciamo deliberatamente per esporre solo metodi per i quali possiamo garantire determinati livelli di prestazioni. Questo è il motivo per cui non esponiamo un metodo per eseguire un'operazione su un intero elenco, ad esempio. Giusto punto sui documenti per utenti esperti. In caso di dubbi, prova il nostro gruppo Google per conversazioni dettagliate: groups.google.com/forum/#!forum/firebase-talk Il team è molto attivo qui!
Rob DiMarco,

1
@RobDiMarco È meraviglioso da ascoltare. Ieri ho visto le funzioni di Firebase, ed è stato pubblicizzato tutto il giorno perché pensavo che Firebase fosse un punto di svolta e stia per rivoluzionare il back-end. Seriamente, potrei insegnare a qualcuno che non ha mai codificato in vita sua per mantenere un backend su Firebase. È abbastanza sorprendente e abbastanza spaventoso. Saluti
Ced

5

Puoi prendere i dettagli con il seguente codice.

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

Penso che l'approccio migliore sia definire gli id ​​degli utenti in base all'oggetto auth fornito da Firebase. Quando creo i miei utenti, faccio:

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

Questo ID proviene da:

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

I servizi di autenticazione Firebase assicureranno sempre un ID univoco tra tutti i loro provider da impostare su uid. In questo modo avrai sempre auth.uid e potrai accedere facilmente all'utente desiderato per aggiornarlo, come:

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

2

Questa è stata la parafrasi di un post che mi ha aiutato quando ho cercato di accedere all'ID univoco generato automaticamente. Accedi a ID univoci di Firebase con ng-repeat usando la sincronizzazione implicita di angularFire

Grazie, bennlich (fonte):

Firebase si comporta come un normale oggetto javascript. Forse l'esempio che segue può portarti sulla strada giusta.

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

Modifica: non sicuro al 100% del risultato desiderato, ma ecco un po 'di più che potrebbe innescare un momento' aha '. Fai clic sulla chiave a cui stai tentando di accedere direttamente nella dashboard di Firebase. Da lì puoi usare qualcosa come:

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

Ciao Anthony, grazie per le informazioni relative alla struttura REST (?) E sicuramente ha strizzato un 'aha'. Ripensando a questo post, mi è chiaro ora che avevo strutturato i miei dati in modo un po 'imbarazzante, grazie per i suggerimenti e lo terrò a mente per il mio prossimo progetto basato sulla base del fuoco!
Richard Bamford,

2

Ecco come accedere alle chiavi univoche generate automaticamente in Firebase: struttura dei dati : - 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

Il modo più semplice è smettere di usare il .push(){}

funzione che genererà quella chiave casuale. Invece usa la .update(){}funzione in cui puoi specificare il nome del figlio invece di avere la chiave casuale.


1

Recupero dati:

Nel tuo database, stai utilizzando un ID casuale che viene generato utilizzando il push(), quindi se desideri recuperare i dati, procedi come segue:

Utilizzo di Firebase nell'app Android:

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

Utilizzo di Firebase in Javascript:

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

Qui hai l'istantanea (posizione dei dati), usersquindi esegui il ciclo all'interno di tutti gli ID casuali e recuperi i nomi.


Recupero dei dati per un utente specifico:

Ora se desideri recuperare informazioni solo per un utente specifico, devi aggiungere una query:

Utilizzo di Firebase nell'app Android:

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

Utilizzo di Firebase con Javascript

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

Usare orderByChild("name").equalTo("Alex")è come dire where name="Alex"quindi recupererà i dati relativi ad Alex.


Miglior modo:

La cosa migliore è utilizzare l'autenticazione Firebase, generando così un ID univoco per ciascun utente e utilizzandolo al posto di un ID casuale push(), in questo modo non è necessario eseguire il ciclo tra tutti gli utenti poiché si dispone dell'ID e si può facilmente accedervi.

Innanzitutto, l'utente deve aver effettuato l'accesso, quindi è possibile recuperare l'ID univoco e collegare un listener per recuperare gli altri dati di quell'utente:

Utilizzo di Firebase con 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) {
      }
 });

Utilizzo di Firebase con 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

Il modo più semplice e migliore per aggiungere un ID univoco al tuo database in base all'utente autenticato è questo:

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

L'IId sarà un ID univoco per un utente / e-mail autenticato specifico


3
Questo non affronta la domanda. La domanda era come ottenere e impostare i dati in account utente specifici. Il tuo codice crea un account utente e in realtà non è valido poiché non puoi .setValue (utente) perché l' utente non è un parametro valido.
Jay,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.