Получить пользователей по имени свойства с помощью Firebase
Я пытаюсь создать приложение, где я могу получить/установить данные в определенных учетных записях пользователей, и я был соблазнен Firebase.
проблема, с которой я сталкиваюсь, заключается в том, что я не знаю, как ориентироваться на конкретные данные пользователей, когда моя структура выглядит так:
online-b-cards
- users
- InnROTBVv6FznK81k3m
- email: "hello@hello"
- main: "Hello world this is a text"
- name: "Alex"
- phone: 12912912
Я посмотрел вокруг, и я действительно не могу найти ничего о том, как получить доступ к отдельным данным, не говоря уже о том, когда им дают какой-то случайный хэш в качестве их идентификатора.
Как бы я идти о захвате информация об отдельных пользователях на основе их имени? Если есть лучший способ сделать это, пожалуйста, скажи мне!
8 ответов:
ранее Firebase требовала, чтобы вы создавали свои собственные индексы или загрузите все данные в расположение, чтобы найти и получить элементы, соответствующие некоторому дочернему атрибуту (например, все пользователи с
name === "Alex"
).в октябре 2014 года Firebase выпустила новую функциональность запросов через
orderByChild()
метод, который позволяет выполнить этот тип запроса быстро и эффективно. См. обновленный ответ ниже.
при записи данных в Firebase, у вас есть несколько различных вариантов, которые отражают различные варианты использования. На высоком уровне Firebase является древовидным хранилищем данных NoSQL и предоставляет несколько простых примитивов для управления списками данных:
написать к Firebase с уникальным, известным ключом:
ref.child('users').child('123').set({ "first_name": "rob", "age": 28 })
добавить к спискам с автоматически сгенерированным ключом, который будет автоматически сортироваться по времени написано:
ref.child('users').push({ "first_name": "rob", "age": 28 })
слушать для изменения данных по своему уникальному, известному пути:
ref.child('users').child('123').on('value', function(snapshot) { ... })
фильтр или ордер данные в списке ключ или атрибут value:
// 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', ...)
С добавлением
orderByChild()
, вам больше не нужно создавать свой собственный индекс для запросов по атрибутам ребенка! Например, чтобы получить всех пользователей с именем "Алекс":ref.child('users').orderByChild('name').equalTo('Alex').on('child_added', ...)
инженер на огневой базе здесь. При записи данных в Firebase, у вас есть несколько различных вариантов, которые будут отражать различные варианты использования приложения. Поскольку Firebase является хранилищем данных NoSQL, вам нужно будет либо хранить объекты данных с уникальными ключами, чтобы вы могли напрямую обращаться к этому элементу, либо загружать все данные в определенном месте и перебирать каждый элемент, чтобы найти нужный узел. Смотрите Запись Данных и Управление Списками для получения дополнительной информации.
когда вы пишете данные в Firebase, вы можете либо
set
данные с использованием уникального, определенного пути (т. е.a/b/c
), илиpush
данные в список, который будет генерировать уникальный идентификатор (т. е.a/b/<unique-id>
) и позволяют сортировать и запрашивать элементы в этом списке по времени. Уникальный идентификатор, который вы видите выше, создается путем вызоваpush
добавить элемент в список вonline-b-cards/users
.вместо
push
здесь, я рекомендовал бы использоватьset
, и хранение данных для каждого пользователя с помощью уникального ключа, например, адрес электронной почты пользователя. Затем вы можете получить доступ к данным пользователя напрямую, перейдя кonline-b-cards/users/<email>
через Firebase JS SDK. Например: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('hello@hello.com')) myUser.set({ email: 'hello@hello.com', name: 'Alex', phone: 12912912 });
обратите внимание, что поскольку Firebase не разрешает определенные символы в ссылках (см. Создание Ссылок), то удалить
.
и заменить на,
в коде выше.
вы можете захватить данные с помощью следующего кода.
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()); }
Я думаю, что лучший подход заключается в определении идентификаторов пользователей на основе объекта auth, предоставленного Firebase. Когда я создаю своих пользователей, я делаю:
FirebaseRef.child('users').child(id).set(userData);
этот код поставляется из:
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); });
службы аутентификации Firebase всегда будут обеспечивать уникальный идентификатор среди всех своих поставщиков, который будет установлен в uid. Таким образом, вы всегда будете иметь auth.uid и может легко получить доступ к нужному пользователю, чтобы обновить его, например:
FirebaseRef.child('users').child(id).child('name').set('Jon Snow');
Это было перефразирование сообщения, которое помогло мне при попытке получить доступ к автоматически сгенерированному уникальному идентификатору. доступ к уникальным идентификаторам Firebase в ng-repeat с помощью angularfire implicit sync
спасибо, bennlich (источник):
Firebase ведет себя как обычный объект javascript. Возможно, приведенный ниже пример поможет вам на правильном пути.
<div ng-repeat="(name, user) in users"> <a href="" ng-href="#/{{name}}">{{user.main}}</a> </div>
Edit: не на 100% уверен в желаемом результате, но вот немного больше, что может искра и' ага ' момент. Нажмите на ключ, который вы пытаетесь получить доступ прямо на панели управления Firebase. Оттуда вы можете использовать что-то вроде:
var ref = new Firebase("https://online-b-cards.firebaseio.com/users/<userId>/name); ref.once('value', function(snapshot) { $scope.variable= snapshot.val(); });
Это как получить доступ к автоматически сгенерированным уникальным ключам в Firebase: структуры данных: - 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); });
самый простой способ-перестать использовать
.push(){}
функция, которая будет генерировать случайный ключ, что. Но вместо этого используйте
.update(){}
функция, в которой вы можете указать имя ребенка вместо случайного ключа.
извлечение данных:
в вашей базе данных, вы используете случайный идентификатор, который создается с помощью
push()
, поэтому если вы хотите получить данные затем сделайте следующее:использование Firebase в Android App:
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) { } });
использование Firebase в Javascript:
firebase.database().ref().child("users").on('value', function (snapshot) { snapshot.forEach(function(childSnapshot) { var name=childSnapshot.val().name; }); });
здесь у вас есть снимок (расположение данных) в
users
тогда вы петля внутри всех случайные идентификаторы и получить имена.
получение данных для конкретного пользователя:
теперь, если вы хотите получить информацию только для конкретного пользователя, то вам нужно добавить запрос:
использование Firebase в Android App:
DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child("users"); Query queries=ref.orderByChild("name").equalTo("Alex"); queries.addListenerForSingleValueEvent(new ValueEventListener() {...}
использование Firebase с Javascript
firebase.database().ref().child("users").orderByChild("name").equalTo("Alex").on('value', function (snapshot) { snapshot.forEach(function(childSnapshot) { var name=childSnapshot.val().name; }); });
используя
orderByChild("name").equalTo("Alex")
это как сказатьwhere name="Alex"
так что он будет извлекать данные родственник Алекса.
Лучшим Образом:
лучше всего использовать аутентификацию Firebase, тем самым создавая уникальный идентификатор для каждого пользователя и используя его вместо случайного идентификатора
push()
, таким образом, вам не нужно перебирать всех пользователей, так как у вас есть идентификатор и вы можете легко получить к нему доступ.во-первых, пользователь должен быть подписан, то вы можете получить уникальный идентификатор и прикрепить прослушиватель для получения других данных этого пользователь:
использование Firebase с 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) { } });
использование Firebase с 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; });
самый простой и лучший способ добавить уникальный идентификатор в базу данных ur в соответствии с аутентифицированным пользователем:
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);
жидкость будет уникальный идентификатор для конкретного проверку подлинности электронной почты