Ottieni utenti per nome proprietà usando Firebase

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

Il problema che sto avendo è che non so come indirizzare i dati specifici degli utenti quando la mia struttura assomiglia a questo:

La mia struttura dati descritta dal testo qui sotto.

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 gli viene dato un hash casuale come loro ID.

Come potrei ottenere informazioni sui singoli utenti in base al loro nome? Se c’è un modo migliore per farlo, per favore dimmelo!

In precedenza, Firebase richiedeva all’utente di generare i propri indici o scaricare tutti i dati in una posizione per trovare e recuperare elementi corrispondenti a qualche attributo secondario (ad esempio, tutti gli utenti con name === "Alex" ).

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


Durante la scrittura di dati su Firebase, hai a disposizione diverse opzioni che rifletteranno i diversi casi d’uso. Ad un livello elevato, Firebase è un data store NoSQL strutturato in struttura ad albero e fornisce alcune semplici primitive per la gestione degli elenchi di dati:

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

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

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

     ref.child('users').child('123').on('value', function(snapshot) { ... }) 
  4. Filtra o ordina i dati in un elenco per chiave o valore di 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 presso Firebase qui. Quando scrivi dati in Firebase, hai a disposizione diverse opzioni che rifletteranno i diversi casi d’uso delle applicazioni. Poiché Firebase è un archivio dati NoSQL, è necessario memorizzare gli oggetti dati con chiavi univoche in modo da poter accedere direttamente a quell’elemento o caricare tutti i dati in una determinata posizione e scorrere ciclicamente ciascun elemento per trovare il nodo che si sta cercando per. Vedere Scrittura di dati e gestione degli elenchi per ulteriori informazioni.

Quando scrivi i dati in Firebase, puoi set dati utilizzando un percorso univoco, definito (ad esempio a/b/c ), o inserire dati in un elenco, che genererà un ID univoco (cioè a/b/ ) e ti permettono di ordinare e interrogare gli articoli in quell’elenco entro il tempo. L’ID univoco che stai vedendo sopra viene generato chiamando push per aggiungere un elemento all’elenco a online-b-cards/users .

Anziché utilizzare push qui, ti consigliamo di utilizzare set e di archiviare i dati per ciascun utente utilizzando una chiave univoca, ad esempio l’indirizzo email dell’utente. Quindi puoi accedere direttamente ai dati dell’utente navigando su online-b-cards/users/ tramite l’SDK JS di Firebase. 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 }); 

Nota che poiché Firebase non consente determinati caratteri nei riferimenti (vedi Creazione di riferimenti ), rimuoviamo il . e sostituirlo con un , nel codice sopra.

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

Penso che l’approccio migliore sia definire gli id ​​degli utenti basati sull’object auth fornito da Firebase. Quando creo i miei utenti, lo 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 garantiranno 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'); 

Questa è stata una parafrasi di un post che mi ha aiutato nel tentativo di accedere all’ID univoco generato automaticamente. Accedere agli ID univoci Firebase all’interno di ng-repeat usando la sincronizzazione implicita di angularFire

Grazie, bennlich (fonte):

Firebase si comporta come un normale object javascript. Forse l’esempio qui sotto può portarti sulla strada giusta.

  

Modifica: Non sicuro al 100% del risultato desiderato, ma ecco un po ‘di più che potrebbe scatenare 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//name); ref.once('value', function(snapshot) { $scope.variable= snapshot.val(); }); 

Ecco come accedere alle chiavi uniche 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); }); 

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

funzione che genererà quella chiave casuale. Ma invece usa la funzione .update(){} dove puoi specificare il nome del bambino invece di avere la chiave casuale.

Recupero dati:

Nel tuo database, stai usando un ID casuale che viene generato usando push() , quindi se vuoi recuperare i dati allora fai quanto segue:

Utilizzo di Firebase nell’app per 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) { } }); 

Utilizzando 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) agli users quindi fai un loop all’interno di tutti gli ID casuali e recuperi i nomi.


Recupero dei dati per un utente specifico:

Ora se si desidera recuperare le informazioni solo per un utente specifico, è necessario aggiungere una query:

Utilizzo di Firebase nell’app per 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; }); }); 

Usando orderByChild("name").equalTo("Alex") è come dire where name="Alex" così recupererà i dati relativi ad Alex.


Miglior modo:

La cosa migliore è usare Firebase Authentication, generando così un id univoco per ogni utente e utilizzandolo al posto di un id casuale push() , in questo modo non è necessario scorrere tutti gli utenti da quando si ha l’id e si può accedere facilmente esso.

Innanzitutto, l’utente deve essere connesso, quindi è ansible recuperare l’ID univoco e colbind un listener per recuperare gli altri dati di tale utente:

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

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

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’interfaccia utente sarà un ID univoco per una specifica email / utente autenticato