2013-02-19 32 views
108

Sto provando a creare un'applicazione in cui posso ottenere/impostare dati in account di utenti specifici e sono stato tentato da Firebase.Ottieni utenti per nome proprietà utilizzando Firebase

Il problema che sto avendo è che io non so come bersaglio i dati specifici utenti quando la mia struttura simile a questa:

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 

Ho guardato intorno e posso Troviamo davvero qualcosa su come accedere ai dati individuali e tanto meno quando viene loro fornito un hash casuale come loro ID.

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

+0

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

risposta

133

In precedenza, Firebase ha richiesto di generare i propri indici o scaricare tutti i dati in un luogo per trovare e recuperare gli elementi che hanno abbinato un certo attributo figlio (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, sono disponibili diverse opzioni che rifletteranno i diversi casi d'uso. Ad alto livello, Firebase è un archivio dati NoSQL con struttura ad albero, e fornisce alcuni semplici primitive per la gestione di liste di dati:

  1. Scrivi a Firebase con un unico tasto, nota:

    ref.child('users').child('123').set({ "first_name": "rob", "age": 28 }) 
    
  2. Append a liste con una chiave auto-generata automaticamente che ordina per tempo scritte:

    ref.child('users').push({ "first_name": "rob", "age": 28 }) 
    
  3. Ascoltare per modifiche nei dati per la sua unica, percorso noto:

    ref.child('users').child('123').on('value', function(snapshot) { ... }) 
    
  4. Filtro o ordine dati in un elenco di 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 t 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 di "Alex":

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

Engineer 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 Writing Data e Managing Lists per ulteriori informazioni.

Quando si scrivono dati in Firebase, è possibile set dati utilizzando un unico, percorso definito (cioè a/b/c), o push dati in una lista, che genererà un ID univoco (cioè a/b/<unique-id>) e consentono di ordinare e interrogare gli articoli in quell'elenco per volta. 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, si consiglia di utilizzare set e di memorizzare i dati per ciascun utente utilizzando una chiave univoca, ad esempio l'indirizzo di posta elettronica dell'utente. Quindi puoi accedere direttamente ai dati dell'utente navigando su online-b-cards/users/<email> 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('[email protected]')) 
myUser.set({ email: '[email protected]', name: 'Alex', phone: 12912912 }); 

Nota che, dal momento Firebase non consente alcuni caratteri di riferimenti (vedi Creating References), togliamo il . e sostituiremo con un , nel codice sopra.

+2

Perfetto! grazie per la risposta Rob. Firebase amorevole! –

+0

Quello che non ottengo è quando si esegue una query u ottenere un oggetto che ha l'id come una proprietà, in questo caso l'e-mail di escape, il valore è l'oggetto che si imposta. Naturalmente se stai leggendo una lista non conosci l'id quindi ... come si suppone di leggere i dati? – Sam

+0

@Sam Non capisco perfettamente la tua domanda, ma se presenti una domanda a parte con un codice di esempio e spieghi il tuo caso d'uso, sono felice di dare una mano. –

2

Questa è stata una parafrasi di un post che mi ha aiutato nel tentativo di accedere all'ID univoco generato automaticamente. Access Firebase unique ids within ng-repeat using angularFire implicit sync

Grazie, bennlich (sorgente):

Firebase si comporta come un oggetto JavaScript normale. Forse l'esempio qui sotto può portarti sulla strada giusta.

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

Edit: Non sicuro al 100% del risultato desiderato, ma ecco un po 'di più che potrebbe innescare un 'aha' momento. Fai clic sulla chiave a cui stai tentando di accedere direttamente nella dashboard di Firebase. Da lì si può 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(); 
}); 
+0

Ciao Anthony, grazie per le informazioni riguardanti la struttura REST (?) E sicuramente ha fatto strick e 'aha'. Guardando indietro a questo post mi è chiaro ora che avevo strutturato i miei dati in un modo un po 'scomodo, grazie per i suggerimenti e lo terrò a mente per il mio prossimo progetto basato su Firebase! –

4

penso che l'approccio migliore è quello di definire gli ID dei utenti in base o l'oggetto auth fornito dal Firebase. Quando creo i miei utenti, che 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); 
}); 

servizi Il Firebase autenticazione sarà sempre garantire un ID univoco tra tutti i loro fornitori per essere fissati a uid. In questo modo si avrà sempre l'auth.uid e può facilmente accedere l'utente desiderato per aggiornarlo, come:

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

È possibile afferrare i dettagli dal 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()); 
        } 
1

Questo è come accedere l'auto ha generato chiavi univoche a Firebase: struttura 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); 
}); 
0

Il modo più semplice e migliore per aggiungere ID univoco a ur database secondo 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'UID sarà un ID univoco per una specifica autenticato e-mail/user

+3

Questo non risolve 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 in quanto non può .setValue (utente) perché * utente * non è un parametro valido. – Jay

0

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

che genererà la chiave casuale. Utilizzare invece la funzione .update(){} in cui è possibile specificare il nome del figlio anziché la chiave casuale.

Problemi correlati