Compartiré mi estructura de base de datos primero:

Timetable
   Ladybridge High School, Bolton, UK
      Name: Ladybridge High School
      Town: Bolton
      Country: UK
      User
         Email: rafansari97@gmail.com
         First Name: Raf
         Last Name: Ansari
   St James High School, Bolton, UK
      Name: St James High School
      Town: Bolton
      Country: UK
      User
         Email: raf-a@live.co.uk
         First Name: Raf
         Last Name: Ansari

Ahora, digamos que rafansari97@gmail.com ha ingresado exitosamente a través de Firebase Authentication. ¿Cómo haría para recuperar sus datos anidados arriba (Nombre: Ladybridge High School, Ciudad: Bolton, etc.) sin conocer la referencia de ruta completa, es decir, solo podré especificar "Horario" como la ruta? Entiendo que puedo construir un árbol separado que relaciona el correo electrónico del usuario con el segundo nodo, pero me gustaría evitar esa solución si es posible.

0
Raf A 4 ene. 2020 a las 00:21

2 respuestas

La mejor respuesta

Con su estructura de datos actual, necesitará usar una consulta para encontrar los nodos que coinciden con la dirección de correo electrónico.

Algo así como:

DatabaseReference ref = FirebaseDatabase.getInstance().getReference("Timetable");
Query query = ref.orderByChild("User/Email").equalTo("rafansari97@gmail.com");
query.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot userSnapshot: dataSnapshot.getChildren()) {
            System.out.println(userSnapshot.getKey()); // Ladybridge High School, Bolton, UK
            System.out.println(userSnapshot.child("Name").getValue(String.class)); // Ladybridge High School
        }
    }

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

El bucle for es necesario ya que varios nodos pueden coincidir con la dirección de correo electrónico dada. Incluso si se asegura de que solo haya una coincidencia, la API no puede saberlo, por lo que deberá realizar un ciclo.

1
Frank van Puffelen 3 ene. 2020 a las 22:06

No creo que su modelo de base de datos sea correcto. Cuando registra un usuario, cada usuario único obtiene su propia identificación única. Modele sus datos utilizando esos identificadores únicos que puede obtener a través de FirebaseUser.getUniqueId (). Si haces eso, se verá de la siguiente manera:

Timetable
  ASDNJ2332IWQE23ZXWQ:    
      School: Ladybridge High School, Bolton, UK
      Name: Ladybridge High School
      Town: Bolton
      Country: UK
      User
         Email: rafansari97@gmail.com
         First Name: Raf
         Last Name: Ansari
  SDASFSDGSEGEEFGEGRG:
      School: St James High School, Bolton, UK
      Name: St James High School
      Town: Bolton
      Country: UK
      User
         Email: raf-a@live.co.uk
         First Name: Raf
         Last Name: Ansari

De esta manera, puede obtener una identificación única de los usuarios y buscar en su base de datos usando esa cadena

1
Yunus Kulyyev 3 ene. 2020 a las 21:41