Получить пользователей по имени с использованием Firebase
Я пытаюсь создать приложение, в котором я могу получить/установить данные в конкретных учетных записях пользователей, и я был искушен Firebase.
Проблема, с которой я сталкиваюсь, заключается в том, что я не знаю, как настроить целевые данные пользователей, когда моя структура выглядит так:
![My data structure described by the text below.]()
online-b-cards
- users
- InnROTBVv6FznK81k3m
- email: "[email protected]"
- main: "Hello world this is a text"
- name: "Alex"
- phone: 12912912
Я огляделся, и я не могу найти ничего о том, как обращаться к отдельным данным, не говоря уже о том, когда им присваивается некоторый случайный хеш в качестве их идентификатора.
Как я собираюсь захватить индивидуальную пользовательскую информацию на основе их имени? Если есть лучший способ сделать это, пожалуйста, скажите мне!
Ответы
Ответ 1
Ранее 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) { ... })
-
Фильтруйте или упорядочивайте данные в списке по ключу или значению атрибута:
// 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 у вас есть несколько разных опций, которые будут отражать разные варианты использования приложения. Поскольку Firebase является хранилищем данных NoSQL, вам нужно будет либо хранить ваши объекты данных с уникальными ключами, чтобы вы могли напрямую обращаться к этому элементу, либо загружать все данные в определенном месте и циклически проходить по каждому элементу, чтобы найти нужный вам узел, См. Запись данных и управление списками для получения дополнительной информации.
Когда вы пишете данные в Firebase, вы можете set
данные, используя уникальный, определенный путь (например, a/b/c
), или push
данные в список, который сгенерирует уникальный идентификатор (то есть a/b/<unique-id>
) и позволяет сортировать и запрашивать элементы в этом списке по времени. Уникальный идентификатор, который вы видите выше, генерируется путем push
кнопки 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('[email protected]'))
myUser.set({ email: '[email protected]', name: 'Alex', phone: 12912912 });
Обратите внимание, что поскольку Firebase не разрешает определенные символы в ссылках (см. Создание ссылок), мы удаляем .
и замените его на ,
в коде выше.
Ответ 2
Вы можете получить информацию по следующему коду.
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
Я думаю, что лучший подход - определить идентификаторы пользователей, основанные на объекте 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');
Ответ 4
Это было перефразирование сообщения, которое помогло мне при попытке получить доступ к автогенерированному уникальному идентификатору. Доступ к уникальным идентификаторам Firebase в ng-repeat с использованием неявной синхронизации angularFire
Спасибо, bennlich (источник):
Firebase ведет себя как обычный объект javascript. Возможно, приведенный ниже пример может привести вас к правильному пути.
<div ng-repeat="(name, user) in users">
<a href="" ng-href="#/{{name}}">{{user.main}}</a>
</div>
Изменить: не на 100% уверен в желаемом исходе, но здесь немного больше, что может вызвать "ага". Нажмите на ключ, который вы пытаетесь получить доступ прямо на панели управления Firebase. Оттуда вы можете использовать что-то вроде:
var ref = new Firebase("https://online-b-cards.firebaseio.com/users/<userId>/name);
ref.once('value', function(snapshot) {
$scope.variable= snapshot.val();
});
Ответ 5
Вот как получить доступ к автоматически созданным уникальным ключам в Firebase:
структура данных: - Онлайн-игры - 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
Самый простой способ - отказаться от использования .push(){}
которая будет генерировать этот случайный ключ. Вместо этого используйте функцию .update(){}
, где вы можете указать имя дочернего элемента вместо случайного ключа.
Ответ 7
Извлечение данных:
В вашей базе данных вы используете случайный идентификатор, который генерируется с помощью push()
, поэтому, если вы хотите получить данные, выполните следующие действия:
Использование Firebase в приложении для 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) {
}
});
Использование Firebase в Javascript:
firebase.database().ref().child("users").on('value', function (snapshot) {
snapshot.forEach(function(childSnapshot) {
var name=childSnapshot.val().name;
});
});
Здесь у вас есть снимок (расположение данных) у users
затем вы зацикливаетесь на всех случайных идентификаторах и извлекаете имена.
Получение данных для конкретного пользователя:
Теперь, если вы хотите получить информацию только для конкретного пользователя, вам нужно добавить запрос:
Использование Firebase в приложении для Android:
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"
поэтому он будет извлекать данные, относящиеся к 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;
});
Ответ 8
Самый простой и лучший способ добавить уникальную базу данных Id в 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);
UId будет уникальным идентификатором для определенного аутентифицированного адреса электронной почты/пользователя