Estoy tratando de crear una aplicación donde puedo conseguir/conjunto de datos específicos en las cuentas de usuarios y estuve tentado por Firebase.

El problema que estoy teniendo es que no sé cómo objetivo específico de datos de los usuarios cuando mi estructura se parece a esto:

Conseguir que los usuarios por el nombre de la propiedad en base avanzada

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

He mirado alrededor y realmente no puedo encontrar nada sobre cómo acceder a los datos individuales no digamos cuando se le dan algunos al azar hash como su ID.

Cómo se podría ir sobre el acaparamiento de información personal del usuario en función de su nombre? Si hay una mejor manera de hacer esto, por favor, dime!

8 Comentarios

  1. 155

    Anteriormente, Firebase que se requieren para generar sus propios índices o descargar todos los datos en una ubicación para encontrar y recuperar los elementos que coinciden algunos de los niños de atributo (por ejemplo, todos los usuarios con name === "Alex").

    De octubre de 2014, Firebase lanzó de nuevo la consulta de la funcionalidad a través de la orderByChild() método, que permite realizar este tipo de consultas de forma rápida y eficiente. Ver la versión actualizada de respuesta a continuación.


    Al escribir los datos en la base avanzada, usted tiene algunas opciones diferentes que se reflejan los diferentes casos de uso. En un nivel alto, Firebase es un árbol estructurado NoSQL almacén de datos, y proporciona un par de simples primitivas para la gestión de listas de datos:

    1. Escribir a base avanzada con un único, conocido clave:

      ref.child('users').child('123').set({ "first_name": "rob", "age": 28 })
      
    2. Anexar a las listas con un auto-generada la clave que se ordenan automáticamente por el tiempo escrito:

      ref.child('users').push({ "first_name": "rob", "age": 28 })
      
    3. Escuchar para cambios en datos, por su única, conocida ruta de acceso:

      ref.child('users').child('123').on('value', function(snapshot) { ... })
      
    4. Filtro o el fin de datos en una lista por clave o el valor del atributo:

      //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 la adición de orderByChild(), ya no necesita para crear su propio índice para consultas de niño atributos! Por ejemplo, para recuperar todos los usuarios con el nombre de «Alex»:

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

    Ingeniero en Firebase aquí. Cuando se escriben datos en la base avanzada, usted tiene algunas opciones diferentes que se reflejan de aplicación diferentes casos de uso. Desde Firebase es un almacén de datos NoSQL, que tendrá que guardar sus objetos de datos con claves únicas de modo que usted puede acceder directamente a ese elemento o cargar todos los datos en una ubicación en particular y de bucle a través de cada elemento para encontrar el nodo que está buscando. Ver La Escritura De Datos y Gestión De Listas para obtener más información.

    Al escribir datos en la base avanzada, puede set de datos utilizando un único, camino definido (es decir,a/b/c), o push datos en una lista, la cual generará un identificador único (es decir,a/b/<unique-id>) y le permiten ordenar y consulta de los elementos de la lista por el tiempo. El identificador único que está viendo de arriba es generada llamando push para añadir un elemento a la lista en online-b-cards/users.

    Lugar de utilizar push aquí, me gustaría recomendar el uso de set, y almacenamiento de datos para cada usuario mediante una clave única, tales como la dirección de correo del usuario. Entonces usted puede acceder a los datos del usuario directamente accediendo a online-b-cards/users/<email> a través de la base avanzada JS SDK. Por ejemplo:

    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 que desde Firebase no permiten que ciertos personajes en las referencias (ver La Creación De Referencias), se elimina el . y reemplazarlo con un , en el código anterior.

    • Perfecto! gracias por la respuesta de Rob. Amante de firebase!
    • Lo que no se es cuando u hacer una consulta u obtener un objeto que tiene el identificador como una propiedad, en este caso el escape de correo electrónico, siendo el valor del objeto que se establezca. Por supuesto, si su lectura de una lista de la u no saber el id así que… ¿cómo u supone para leer los datos?
    • No entiendo bien tu pregunta, pero si presentar una cuestión separada con algún código de ejemplo y explicar su caso, estoy feliz de ayudar.
    • ¿Tienes una respuesta para la pregunta publicado por debajo de Stephen?
    • Hey @RobDiMarco. Mientras que su sugerencia para el uso de direcciones de correo electrónico como base para la identificación sigue siendo válida, valdría la pena ampliar su respuesta a señalar a la nueva orderByChild característica. Dado que esta respuesta aparece muy a menudo como relevantes relacionados a la respuesta, la gente está obligado a mirar y deben ser conscientes de las nuevas características de la consulta.
    • Gran idea, gracias por la nota. Voy a conseguir esta actualizado hoy.
    • Estoy usando angular de fuego ,por favor me dicen los mismo métodos aplicables
    • su respuesta es describir el concepto claramente pero, todavía no estoy recibiendo ¿cómo puedo lograr el filtrado de la lista.
    • Desde que trabajo en Firebase, tengo un par de preguntas, ¿por qué es la API de base de datos de manera restrictiva ? Cuáles son las funciones en el trabajo ? Dónde se puede solicitar nuevas características ? Yo sugeriría que usted amplíe su documentación con una sección avanzada para describir cómo funciona bajo el capó. No cada uno con Firebase es una base de datos analfabeta y el no entender las cosas bajo el capó se hace más difícil a la razón acerca de que la caja negra, por lo menos hace más difícil entender por qué es como es.
    • Por desgracia, no puedo comentar sobre lo que es en las obras. Te prometo que vamos a trabajar duro (que siempre ha sido así), pero no puede dar detalles. La API de Base de datos es, en efecto restrictivo en algunos aspectos, y lo hacemos deliberadamente para exponer únicamente los métodos por los cuales podemos garantizar ciertos niveles de rendimiento. Esta es la razón por la que no expone un método para ejecutar una operación a través de una lista completa, por ejemplo. Justo en el punto de docs para usuarios avanzados. En caso de duda, pruebe nuestro Grupo de Google para las conversaciones detalladas: groups.google.com/forum/#!foro/firebase-talk El equipo es muy activo aquí!
    • Que es maravilloso escuchar. Vi Firebase funciones de ayer, y fue promocionado en todo el día porque pensaba que Firebase es un cambiador de juego y a punto de revolucionar el back-end. En serio, me podría enseñar a alguien que nunca ha codificado en su vida para mantener un backend en Firebase. Eso es bastante increíble, y bastante miedo. Saludos
    • Hay alguna forma de recuperar todos los usuarios con el nombre de contenido una cadena? Así, por ejemplo, si busco con «ald», puedo obtener de los usuarios con nombre «Donald«,»Ronaldo», «Gerald«, etc.
    • Eso no es posible, por lo que yo sé.

  2. 5

    Usted puede agarrar los detalles en el siguiente código.

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

    Creo que el mejor enfoque es definir los identificadores de los usuarios de la base o el auth objeto proporcionado por la base avanzada. Cuando creo que mis usuarios, que debo hacer:

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

    Este id proviene de:

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

    La base avanzada de la autenticación de los servicios será siempre garantizar un identificador único entre todos sus proveedores de servicios se establece en el uido. De esta manera siempre tendrá el auth.uid y se puede acceder fácilmente al usuario que desee actualizar, como:

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

    Esta era una paráfrasis de un post que me ayudó cuando se intenta acceder a la auto-identificación única generada. Acceso Firebase identificadores únicos dentro de ng-repeat utilizando angularFire implícito de sincronización

    Gracias, bennlich (fuente):

    Firebase se comporta como un objeto de javascript. Tal vez el ejemplo a continuación puede conseguir en el camino correcto.

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

    Edit: No es 100% seguro de su resultado deseado, pero aquí es un poco más que podría despertar una ‘aha’ momento. Haga clic en la clave que usted está tratando de acceder a la derecha en su base avanzada panel de control. Desde allí se puede usar algo como:

    var ref = new Firebase("https://online-b-cards.firebaseio.com/users/<userId>/name);
        ref.once('value', function(snapshot) {
            $scope.variable= snapshot.val();
    });
    
    • Hola Antonio, gracias por la información reguarding el RESTO de la estructura (?) y que definitivamente lo hizo cuerda una ‘aha’. Mirando hacia atrás en este post es claro para mí ahora que me había estructurado de mis datos en un poco de una manera poco delicada, gracias por los consejos y lo tendré en cuenta para mi próxima firebase basado en proyecto!
  5. 2

    Esta es la forma de acceder a la auto genera claves únicas en Firebase:
    estructura de datos:
    – 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);
    });
    
  6. 1

    La forma más sencilla es dejar de usar el .push(){}

    función que va a generar que la clave aleatoria. Pero en lugar de utilizar el .update(){} función, donde puede especificar el nombre del niño en lugar de tener la clave aleatoria.

  7. 1

    La recuperación de datos:

    En su base de datos, se utiliza un identificador aleatorio que se genera mediante la push(), por lo tanto, si desea recuperar los datos, a continuación, haga lo siguiente:

    El uso de base avanzada en la Aplicación de 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) {
              }
         });
    

    El uso de base avanzada en Javascript:

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

    Aquí tienes la captura de pantalla(ubicación de los datos) en users entonces usted bucle dentro de todos los identificadores aleatorios y recuperar los nombres.


    Recuperar los datos de un Usuario Específico:

    Ahora si desea recuperar la información de un usuario específico sólo, entonces usted necesita para agregar una consulta:

    El uso de base avanzada en la Aplicación de Android:

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

    El uso de 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;
       });
    });
    

    Utilizando orderByChild("name").equalTo("Alex") es como decir que where name="Alex" por lo que van a recuperar los datos relativos a Alex.


    Mejor Manera:

    Lo mejor es usar la base avanzada de Autenticación, lo que genera un identificador único para cada usuario y el uso que en lugar de un identificador aleatorio push(), de esta manera usted no tiene que recorrer todos los usuarios, ya que tienen el identificador y puede acceder a ella fácilmente.

    Primer lugar, el usuario debe ser firmado en entonces usted puede recuperar el identificador único y adjuntar un oyente para recuperar los datos de ese usuario:

    El uso de base avanzada 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) {
          }
     });
    

    El uso de 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;
       });
    
  8. 0

    La más simple y la mejor manera de agregar Id único a ur de la base de datos de acuerdo a usuario autenticado es este:

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

    El UId será un Identificador único para un determinado correo electrónico autenticado/usuario

    • Eso no resuelve la cuestión. La cuestión era cómo obtener y establecer datos de cuentas de usuario específicas. El código crea una cuenta de usuario y en realidad no es válido como tu no .setValue(usuario), porque usuario no es un parámetro válido.

Dejar respuesta

Please enter your comment!
Please enter your name here