Solución:
Anteriormente, Firebase requería que generaras tus propios índices o descargar todos los datos en una ubicación para buscar y recuperar elementos que coincidan con algún atributo secundario (por ejemplo, todos los usuarios con name === "Alex"
).
En octubre de 2014, Firebase implementó una nueva funcionalidad de consulta a través de orderByChild()
método, que le permite realizar este tipo de consultas de forma rápida y eficaz. Vea la respuesta actualizada a continuación.
Al escribir datos en Firebase, tiene algunas opciones diferentes que reflejarán diferentes casos de uso. En un nivel alto, Firebase es un almacén de datos NoSQL estructurado en árbol y proporciona algunas primitivas simples para administrar listas de datos:
-
Escribir a Firebase con una clave única y conocida:
ref.child('users').child('123').set({ "first_name": "rob", "age": 28 })
-
Adjuntar a listas con una clave generada automáticamente que se ordenará automáticamente por tiempo escrito:
ref.child('users').push({ "first_name": "rob", "age": 28 })
-
Escucha para cambios en los datos por su ruta única y conocida:
ref.child('users').child('123').on('value', function(snapshot) { ... })
-
Filtrar o pedido datos en una lista por llave o valor de 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 crear su propio índice para consultas sobre atributos secundarios. Por ejemplo, para recuperar todos los usuarios con el nombre “Alex”:
ref.child('users').orderByChild('name').equalTo('Alex').on('child_added', ...)
Ingeniero de Firebase aquí. Al escribir datos en Firebase, tiene algunas opciones diferentes que reflejarán diferentes casos de uso de aplicaciones. Dado que Firebase es un almacén de datos NoSQL, deberá almacenar sus objetos de datos con claves únicas para que pueda acceder directamente a ese elemento o cargar todos los datos en una ubicación particular y recorrer cada elemento para encontrar el nodo que está buscando. . Consulte Escribir datos y administrar listas para obtener más información.
Cuando escribe datos en Firebase, puede set
datos utilizando una ruta única y definida (es decir, a/b/c
), o push
datos en una lista, que generará una identificación única (es decir, a/b/<unique-id>
) y le permite ordenar y consultar los elementos de esa lista por tiempo. La identificación única que está viendo arriba se genera llamando push
para agregar un elemento a la lista en online-b-cards/users
.
En lugar de usar push
aquí, recomendaría usar set
y almacenar los datos de cada usuario mediante una clave única, como la dirección de correo electrónico del usuario. Luego, puede acceder a los datos del usuario directamente navegando a online-b-cards/users/<email>
a través del SDK de Firebase JS. 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 });
Tenga en cuenta que, dado que Firebase no permite ciertos caracteres en las referencias (consulte Creación de referencias), eliminamos el .
y reemplácelo con un ,
en el código anterior.
Puede obtener los detalles con 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());
}
Creo que el mejor enfoque es definir los identificadores de los usuarios en función del objeto de autenticación proporcionado por Firebase. Cuando creo mis usuarios, hago:
FirebaseRef.child('users').child(id).set(userData);
Esta identificación 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);
});
Los servicios de autenticación de Firebase siempre garantizarán que una identificación única entre todos sus proveedores se establezca en uid. De esta forma siempre tendrás el auth.uid y podrás acceder fácilmente al usuario deseado para actualizarlo, como:
FirebaseRef.child('users').child(id).child('name').set('Jon Snow');