from - query firebase android
Obtener propiedad de los usuarios usando Firebase (7)
Intento crear una aplicación donde pueda obtener / configurar datos en cuentas de usuarios específicos y Firebase me tentó.
El problema que tengo es que no sé cómo orientar los datos de usuarios específicos cuando mi estructura se ve así:
online-b-cards
- users
- InnROTBVv6FznK81k3m
- email: "hello@hello"
- 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 y mucho menos cuando se les da un hash aleatorio como identificación.
¿Cómo podría obtener información de usuario individual basada en su nombre? Si hay una mejor manera de hacerlo, por favor dígame!
Anteriormente, Firebase requería que generara sus propios índices o descargara todos los datos en una ubicación para buscar y recuperar elementos que coincidieran con algún atributo secundario (por ejemplo, todos los usuarios con el name === "Alex"
).
En octubre de 2014, Firebase implementó nuevas funciones de consulta a través del método orderByChild()
, que le permite realizar este tipo de consultas de manera rápida y eficiente. Ver 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 gestionar listas de datos:
Escribe en Firebase con una clave única y conocida:
ref.child(''users'').child(''123'').set({ "first_name": "rob", "age": 28 })
Añádalo a listas con una clave generada automáticamente que ordenará automáticamente por tiempo escrito:
ref.child(''users'').push({ "first_name": "rob", "age": 28 })
Escuche los cambios en los datos por su ruta única y conocida:
ref.child(''users'').child(''123'').on(''value'', function(snapshot) { ... })
Filtre o solicite datos en una lista por clave 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 es necesario crear su propio índice para consultas sobre los atributos secundarios. Por ejemplo, para recuperar a todos los usuarios con el nombre "Alex":
ref.child(''users'').orderByChild(''name'').equalTo(''Alex'').on(''child_added'', ...)
Ingeniero en Firebase aquí. Al escribir datos en Firebase, tiene algunas opciones diferentes que reflejarán diferentes casos de uso de la aplicación. Dado que Firebase es un almacén de datos NoSQL, necesitará almacenar sus objetos de datos con claves exclusivas para que pueda acceder directamente a ese elemento, o cargar todos los datos en una ubicación determinada y recorrer cada elemento para encontrar el nodo que está buscando. para. Consulte Escritura de datos y administración de listas para más información.
Cuando escribe datos en Firebase, puede set
datos usando una ruta única y definida (es decir, a/b/c
) o push
datos en una lista, lo que generará una identificación única (es decir, a/b/<unique-id>
) y le permite ordenar y consultar los elementos en esa lista por tiempo. La ID única que está viendo arriba se genera llamando a push
para agregar un elemento a la lista en online-b-cards/users
.
En lugar de usar el push
aquí, recomendaría usar el set
y almacenar los datos para cada usuario con una clave única, como la dirección de correo electrónico del usuario. A continuación, puede acceder a los datos del usuario directamente navegando en online-b-cards/users/<email>
través del Firebase 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 });
Tenga en cuenta que dado que Firebase no permite ciertos caracteres en las referencias (consulte Creación de referencias ), eliminamos el .
y reemplázalo con a ,
en el código de arriba.
Creo que el mejor enfoque es definir los identificadores de los usuarios basados en el 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 asegurarán que una ID única entre todos sus proveedores se configure en uid. De esta manera siempre tendrá auth.uid y podrá acceder fácilmente al usuario deseado para actualizarlo, como:
FirebaseRef.child(''users'').child(id).child(''name'').set(''Jon Snow'');
Esta es la forma de acceder a las claves únicas generadas automáticamente 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);
});
Esto fue una paráfrasis de una publicación que me ayudó cuando intentaba acceder a la identificación única generada automáticamente. Acceda a los ID exclusivos de Firebase dentro de ng-repeat usando la sincronización implícita de angularFire
Gracias, bennlich (fuente):
Firebase se comporta como un objeto javascript normal. Tal vez el siguiente ejemplo pueda llevarlo por el camino correcto.
<div ng-repeat="(name, user) in users">
<a href="" ng-href="#/{{name}}">{{user.main}}</a>
</div>
Editar: No estoy 100% seguro de su resultado deseado, pero aquí hay un poco más que podría provocar un momento ''aha''. Haga clic en la tecla a la que está intentando acceder directamente en su tablero de Firebase. Desde allí puedes 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();
});
La forma más simple es dejar de usar el .push(){}
función que generará esa clave aleatoria. Pero en su lugar use la función .update(){}
donde puede especificar el nombre del niño en lugar de tener la clave aleatoria.
La forma más simple y mejor de agregar ID único a tu base de datos según el usuario autenticado es esta:
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);
La UId será una identificación única para un correo electrónico / usuario autenticado específico
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());
}