Проверка базы данных Android Firebase, находится ли пользователь в определенной группе - PullRequest
0 голосов
/ 08 декабря 2018

У меня есть 5 разных типов пользователей. Я хочу проверить, относится ли пользователь к одному из 4 специальных типов пользователей, и изменить интерфейс пользователя на его основе.Это то, что я нашел сам, но это не работает.

mDatabase.child("staff").orderByChild(mAuth.getUid()).equalTo("true").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                String staffType = dataSnapshot.getKey();
                if (staffType == "servers"){
                    mTitles = new ArrayList<>(Arrays.asList(getResources().getStringArray(R.array.menuUser)));
                }
            }

моя база данных firebase

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

В ответе Питера подчеркивается одна проблема, но в вашем коде есть еще одна проблема.

При выполнении запроса к базе данных Firebase потенциально может быть несколько результатов.Таким образом, снимок содержит список этих результатов.Даже если есть только один результат, снимок будет содержать список из одного результата.

Таким образом, код в вашем onDataChange должен обрабатывать это потенциально множественное потомство, выполняя цикл по dataSnapshot.getChildren():

public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
  for (DataSnapshot userSnapshot: dataSnapshot.getChildren()) {
    String staffType = userSnapshot.getKey();
    if (staffType.equals("servers")){
        mTitles = new ArrayList<>(Arrays.asList(getResources().getStringArray(R.array.menuUser)));
    }
}

Хотя проверка может работать с этими изменениями, она никогда не будетэффективный в масштабе, так как вам нужно просмотреть слишком много данных, чтобы найти нужного пользователя.Ваша текущая структура данных позволяет вам эффективно искать всех пользователей для данной роли.Это не позволяет эффективно искать роль для конкретного пользователя.Для этого вы должны добавить дополнительную структуру данных с именно этой информацией: роль для каждого UID.Так что-то вроде:

user-roles
  "22yXY813cW...": "server"
  "uid2": "cook"

С помощью этой дополнительной структуры вы можете эффективно искать роль для пользователя без запроса:

mDatabase.child("user-roles").child(mAuth.getUid()).addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        String staffType = dataSnapshot.getKey();
        if (staffType.equals("servers")){
            mTitles = new ArrayList<>(Arrays.asList(getResources().getStringArray(R.array.menuUser)));
        }
    }
0 голосов
/ 08 декабря 2018

Измените это:

if (staffType == "servers"){
mTitles = new ArrayList<>(Arrays.asList(getResources().getStringArray(R.array.menuUser)));
}

на это:

if (staffType.equals("servers")){
mTitles = new ArrayList<>(Arrays.asList(getResources().getStringArray(R.array.menuUser)));
}

из документов:

public boolean equals(Object anObject)

Сравнениеэта строка для указанного объекта.Результат имеет значение true тогда и только тогда, когда аргумент не равен NULL и является объектом String, представляющим ту же последовательность символов, что и этот объект.

https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#equals(java.lang.Object)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...