Как запросить в Firebase-DB данные типа «WHERE»? - PullRequest
0 голосов
/ 17 февраля 2019

Я работаю над контакт-приложением для Android с FireBase и хочу прочитать значения (здесь: профиль пользователя) от пользователя в моей базе данных, который соответствует указанному адресу электронной почты.

Я пыталсячтобы создать запрос, как показано в этом ответе: https://stackoverflow.com/a/39025129/8739722, но проблема в том, что я не знаю, как применить это к моей структуре базы данных, так как у меня есть другой дочерний элемент (профиль) в моей пользовательской структуре.

Мои узлы выглядят так:

examplary-users-nodes

Мои правила выглядят так:

{
"rules": {
    "users": {
      "$uid": {
        "profile": {
          ".read": "auth.uid != null",
          ".write": "auth.uid == $uid",
        },
        //...
    },
}

Я пытался сделать запрос следующим образом:

String email = "email_address_1";
Query q_1 = ref.child("users").child("profile").orderByChild("email").equalTo(email);

..., приводящий к ошибке «Отказано в доступе».

Я также рассмотрел следующие запросы, но у них неправильный синтаксис или попытка выполнить несколько вызовов orderByChild, что недопустимо:

String email = "email_address_1";
Query q_2 = ref.child("users").orderByChild("profile").child("email").equalTo(email);
Query q_3 = ref.child("users").orderByChild("profile").orderByChild("email").equalTo(email);

Как я могу получить информацию о профиле пользователя с соответствующим адресом электронной почты?

1 Ответ

0 голосов
/ 18 февраля 2019

Firebase Realtime Database запрашивает фильтрацию и упорядочение по одному свойству, которое находится под фиксированным путем / именем под каждым дочерним узлом местоположения, в котором вы выполняете запрос.В вашем случае это свойство меньше profile/email, поэтому ваш запрос становится:

ref.child("users").orderByChild("profile/email").equalTo(email);

Но учтите, что ваши правила отклонят этот запрос, поскольку они запрашивают чтение данных из /users, а вы - нет.предоставить кому-либо разрешение на чтение данных оттуда.Правила безопасности Firebase применяются при подключении слушателя и не могут использоваться для фильтрации данных.Чтобы узнать об этом больше, прочитайте раздел документации под названием , правила - это не фильтры , а множество вопросов , в которых упоминается та же фраза .

. Чтобы быстро протестировать приведенный выше запрос, вы можете временно предоставить каждый доступ к /users.Обязательно верните его обратно, прежде чем делиться вашим приложением с любыми пользователями.

Чтобы обеспечить надежную защиту данных, вам необходимо убедиться в правилах безопасности, что пользователь только пытается прочитать свои собственные данные.Вы можете сделать это с помощью правил безопасности, основанных на запросах .В вашем случае они выглядели бы примерно так:

"users": {
  ".read": "auth.email != null &&
            query.orderByChild == 'profile/email' &&
            query.equalTo == auth.token.email"
}
...