Отримайте користувачів за власністю імен за допомогою Firebase


129

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

Проблема, яку я маю, полягає в тому, що я не знаю, як орієнтуватися на конкретні дані користувачів, коли моя структура виглядає так:

Моя структура даних описана в тексті нижче.

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

Я оглянувся, і я не можу знайти нічого про те, як отримати доступ до окремих даних, не кажучи вже про те, коли їм надається якийсь випадковий хеш як їх ідентифікатор.

Як би я міг захопити інформацію про окремих користувачів на основі їх імені? Якщо є кращий спосіб зробити це, будь ласка, скажіть мені!


Відповіді:


156

Раніше 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(), вам більше не потрібно створювати власний індекс для запитів про дочірні атрибути! Наприклад, щоб отримати всіх користувачів з іменем "Alex":

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додати елемент до списку за адресою 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 не дозволяє певних символів у посиланнях (див. Створення посилань ), ми видаляємо .та заміняємо його на a ,в коді вище.


1
@RobDiMarco Чи є у вас відповідь на питання, яке опублікував Стівен нижче?
Чарльз Хан

2
Привіт @RobDiMarco. Незважаючи на те, що ваша пропозиція використовувати адреси електронної пошти як основу для ідентифікатора, все ще дійсна, можливо, варто розширити свою відповідь, щоб вказати на нову orderByChildфункцію. Зважаючи на те, що ця відповідь досить часто відображається як відповідна / пов’язана з цим відповідь, люди зобов’язані розглядати її і повинні знати про нові функції запиту.
Франк ван Пуффелен

1
@FrankvanPuffelen Чудова ідея - дякую за замітку. Я отримаю це оновлення сьогодні.
Роб ДіМарко

1
@Ced На жаль, я не можу коментувати те, що є у творах. Обіцяю, що ми важко працюємо (це завжди було правдою), але не можу дати конкретики. API бази даних дійсно є деяким обмежуючим принципом, і ми робимо це навмисно, лише щоб викрити методи, для яких ми можемо гарантувати певний рівень продуктивності. Ось чому, наприклад, ми не виставляємо метод запуску операції над усім списком, наприклад. Справедлива точка в документах для досвідчених користувачів. Якщо ви сумніваєтесь, спробуйте нашу групу Google для детальних розмов: groups.google.com/forum/#!forum/firebase-talk Команда тут дуже активна!
Роб ДіМарко

1
@RobDiMarco Це чудово чути. Я вчора бачив функції Firebase, і цілий день був розкручений, тому що я вважав, що Firebase - це зміна ігор, і ось-ось здійснить революцію в бек-енді. Серйозно, я міг би навчити того, хто ніколи не кодував у своєму житті, підтримувати бекенд на Firebase. Це досить дивовижно і досить страшно. Привітання
Ced

5

Ви можете захопити деталі за допомогою наступного коду.

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()); 
                    }

4

Я думаю, що найкращим підходом є визначення ідентифікаторів користувачів на основі аутентичного об’єкта, наданого 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');

2

Це було перефразовуванням публікації, яка допомогла мені при спробі отримати доступ до автоматично створеного унікального ідентифікатора. Доступ до унікальних ідентифікаторів Firebase в межах ng-повтору за допомогою неявної синхронізації angicalFire

Дякую, Бенліх (джерело):

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();
});

Привіт Ентоні, дякую за інформацію, що регулює структуру REST (?), І це, безумовно, вразило "ага". Озираючись на цю посаду, мені зрозуміло, що я структурував свої дані трохи незручно, дякую за поради, і я буду мати це на увазі для мого наступного проекту на базі вогневої бази!
Річард Бамфорд

2

Ось як отримати доступ до автоматично створених унікальних ключів у 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);
});

1

Найпростіший спосіб - це припинити використання .push(){}

функція, яка генерує цей випадковий ключ. Але замість цього використовуйте .update(){}функцію, де ви можете вказати ім’я дитини, а не випадковий ключ.


1

Отримання даних:

У вашій базі даних ви використовуєте випадковий ідентифікатор, який генерується за допомогою 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"тому ви отримаєте дані, пов'язані з Алексом.


Кращий спосіб:

Найкраще - використовувати автентифікацію 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;
   });
 

0

Найпростіший і кращий спосіб додати унікальний Id до бази даних ур відповідно до автентифікованого користувача:

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 буде унікальним ідентифікатором для певної автентифікованої електронної пошти / користувача


3
Це не стосується питання. Питання полягало в тому, як отримати та встановити дані в конкретних облікових записах користувачів. Ваш код створює обліковий запис користувача і насправді недійсний, оскільки ваш не може .setValue (користувач), оскільки користувач не є дійсним параметром.
Джей
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.