Получить пользователей по имени свойства с помощью Firebase


Я пытаюсь создать приложение, где я могу получить/установить данные в определенных учетных записях пользователей, и я был соблазнен Firebase.

проблема, с которой я сталкиваюсь, заключается в том, что я не знаю, как ориентироваться на конкретные данные пользователей, когда моя структура выглядит так:

online-b-cards
  - users
    - InnROTBVv6FznK81k3m
       - email: "hello@hello"
       - main:  "Hello world this is a text"
       - name:  "Alex"
       - phone: 12912912

Я посмотрел вокруг, и я действительно не могу найти ничего о том, как получить доступ к отдельным данным, не говоря уже о том, когда им дают какой-то случайный хэш в качестве их идентификатора.

Как бы я идти о захвате информация об отдельных пользователях на основе их имени? Если есть лучший способ сделать это, пожалуйста, скажи мне!

8 118

8 ответов:

ранее Firebase требовала, чтобы вы создавали свои собственные индексы или загрузите все данные в расположение, чтобы найти и получить элементы, соответствующие некоторому дочернему атрибуту (например, все пользователи с name === "Alex").

в октябре 2014 года Firebase выпустила новую функциональность запросов через orderByChild() метод, который позволяет выполнить этот тип запроса быстро и эффективно. См. обновленный ответ ниже.


при записи данных в Firebase, у вас есть несколько различных вариантов, которые отражают различные варианты использования. На высоком уровне Firebase является древовидным хранилищем данных NoSQL и предоставляет несколько простых примитивов для управления списками данных:

  1. написать к Firebase с уникальным, известным ключом:

    ref.child('users').child('123').set({ "first_name": "rob", "age": 28 })
    
  2. добавить к спискам с автоматически сгенерированным ключом, который будет автоматически сортироваться по времени написано:

    ref.child('users').push({ "first_name": "rob", "age": 28 })
    
  3. слушать для изменения данных по своему уникальному, известному пути:

    ref.child('users').child('123').on('value', function(snapshot) { ... })
    
  4. фильтр или ордер данные в списке ключ или атрибут 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);

жидкость будет уникальный идентификатор для конкретного проверку подлинности электронной почты