Получить пользователей по имени с использованием 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 и предоставляет несколько простых примитивов для управления списками данных:

  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. Фильтруйте или упорядочивайте данные в списке по ключу или значению атрибута:

    // 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 будет уникальным идентификатором для определенного аутентифицированного адреса электронной почты/пользователя