Хобрук: Ваш путь к мастерству в программировании

Как перенаправить несколько типов пользователей на соответствующие действия?

Я создаю приложение для голосования на Firebase. У меня 3 типа пользователей. Пока я могу успешно перенаправить 2 типа пользователей (УЧАЩИХСЯ, УЧИТЕЛЯ) на их соответствующие действия после того, как они войдут в систему с кодом ниже, Мои пользователи на данный момент Но теперь мне нужно добавить еще одного пользователя (ADMIN), и, как и другие пользователи, администратор тоже должен быть перенаправлен на свои собственные действия после входа в систему. Я не понимаю, как изменить свой код для третьего пользователя.

mAuthListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(FirebaseAuth firebaseAuth) {
            FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
            if (mAuth.getCurrentUser() != null) {

                String uid = mAuth.getInstance().getCurrentUser().getUid();
                DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
                uidRef = rootRef.child("STUDENTS").child(uid);

                ValueEventListener valueEventListener = new ValueEventListener() {
                    @Override
                    public void onDataChange(com.google.firebase.database.DataSnapshot dataSnapshot) {
                        if (dataSnapshot.exists()) {
                            //start students activity
                            startActivity(new Intent(MainActivity.this, student.class));

                        } else {
                            //start teachers activity
                            startActivity(new Intent(MainActivity.this, teacher.class));
                        }
                    }

                    //
                    @Override
                    public void onCancelled(DatabaseError databaseError) 
                    {
                    }
                };


uidRef.addListenerForSingleValueEvent(valueEventListener);

            }
            else{
                Log.d("TAG", "firebaseUser is null");
            }


        }
    };

  • Вы пробовали делать то же самое, что делали для ученика и учителя? 20.10.2018
  • Условие IF Else очень хорошо работает для СТУДЕНТА И УЧИТЕЛЯ. Я знаю, что код в порядке, но не знаю, как изменить его для третьего пользователя. Спасибо за ответ, Алекс. 20.10.2018
  • Вы пробовали использовать оператор switch? 21.10.2018
  • В каких именно условиях это будет? не могли бы вы объяснить, пожалуйста. 21.10.2018
  • Вы решили проблему? 22.10.2018
  • Я не использовал оператор switch, я использовал в своем ответе оператор if - else if, чтобы более четко увидеть решение. Пожалуйста, посмотрите мой ответ ниже. 24.10.2018

Ответы:


1

Использование onlye if (dataSnapshot.exists()) не решит ваши 3 типа пользовательских проблем. Предполагая, что тип третьего пользователя 3, необходимо изменить структуру вашей базы данных. Итак, ваша новая схема базы данных должна выглядеть так:

Firebase-root
    |
    --- users
          |
          --- uidOne
          |     |
          |     --- name: "Ed"
          |     |
          |     --- type: 1
          |
          --- uidTwo
          |     |
          |     --- name: "Tyff"
          |     |
          |     --- type: 2
          |
          --- uidOne
                |
                --- name: "Admin"
                |
                --- type: 3

Теперь вы должны добавить слушателя на узел uid и проверить тип пользователя следующим образом:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = rootRef.child("users").child(uid);
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        if(dataSnapshot.child("Type").getValue(Long.class) == 1) {
            startActivity(new Intent(MainActivity.this, student.class));
        } else if (dataSnapshot.child("TYPE").getValue(Long.class) == 2) {
            startActivity(new Intent(MainActivity.this, teacher.class));
        } else if (dataSnapshot.child("TYPE").getValue(Long.class) == 3) {
            startActivity(new Intent(MainActivity.this, admin.class));
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage());
    }
};
uidRef.addListenerForSingleValueEvent(valueEventListener);
24.10.2018
  • Спасибо за ответ. Я скоро попробую. 24.10.2018
  • Хорошо, держи меня в курсе. 24.10.2018
  • Алекс, мне очень жаль. Я даже не смог открыть свой ноутбук из-за плотного графика и некоторых личных обязанностей. однако в эти выходные я полностью свободен, и первое, что я планирую сделать, это написать код, который вы написали. Спасибо. Заботиться о себе. 25.10.2018
  • ошибка при if (dataSnapshot.child (TYPE) == 1). В нем говорится, что оператор == не может применяться к int. Я пробовал преобразовать в длинную строку. тогда он говорит, что оператор == не может применяться к java.lang.string 26.10.2018
  • Алекс, Алекс, Алекс вы спасатели жизни. Буквально. Я внес небольшие изменения в код, и теперь все работает отлично. Более того, теперь я могу добавлять столько типов пользователей, сколько захочу. Все благодаря тебе. Спасибо, что были там. Так много. 26.10.2018

  • 2

    вам нужна другая структура данных с users и roles/admin, roles/teacher, roles/student, а затем проверьте, какой узел имеет ключ (также совместимый с правилами безопасности).

    так как он у вас есть, вы можете просто удалить ветвь else и запросить все три узла.

    19.10.2018
  • Спасибо за ответ. 26.10.2018

  • 3

    Это мой последний код, использующий Kotlin, и он отлично работает.

    mAuth.signInWithEmailAndPassword(Email, Password).addOnCompleteListener { task ->
                    if (task.isSuccessful) {
    
    
    
                        val uid = FirebaseAuth.getInstance().currentUser!!.uid
                        val rootRef = FirebaseDatabase.getInstance().reference
                        val uidRef = rootRef.child("Users").child(uid)
                        val spin: String = userchioce.selectedItem.toString()
                    val valueEventListener: ValueEventListener = object : ValueEventListener {
                        override fun onDataChange(dataSnapshot: DataSnapshot) {
                            when {
                                    dataSnapshot.child("users").getValue(String::class.java) == "Admin" -> {
                                        if (spin.equals("Admin")){
                                    val intent = Intent(this@Login, Admin::class.java)
                                    startActivity(intent)}
                                        else{
                                            Toast.makeText(this@Login, "Select Your User-Type", Toast.LENGTH_SHORT)
                                                .show()
                                        }
                                }
    
                                dataSnapshot.child("users").getValue(String::class.java) == "Lecturer" -> {
                                    if (spin.equals("Lecturer")) {
                                        val intent = Intent(this@Login, Lecturer::class.java)
                                        startActivity(intent)
                                    }else{
                                        Toast.makeText(this@Login, "Select Your User-Type", Toast.LENGTH_SHORT)
                                            .show()
                                    }
                                }
                                dataSnapshot.child("users").getValue(String::class.java) == "Parent" -> {
                                    if (spin.equals("Parent")) {
                                        val intent = Intent(this@Login, Parent::class.java)
                                        startActivity(intent)
                                    }else{
                                        Toast.makeText(this@Login, "Select Your User-Type", Toast.LENGTH_SHORT)
                                            .show()
                                    }
                                }
                                dataSnapshot.child("users").getValue(String::class.java) == "Student" -> {
                                    if (spin.equals("Student")) {
                                        val intent = Intent(this@Login, Student::class.java)
                                        startActivity(intent)
                                    }else{
                                        Toast.makeText(this@Login, "Select Your User-Type", Toast.LENGTH_SHORT)
                                            .show()
                                    }
                                }
                            }
                        }
    
                        override fun onCancelled(databaseError: DatabaseError) {
                            Log.d(TAG, databaseError.message)
                        }
                    }
                    uidRef.addListenerForSingleValueEvent(valueEventListener)
                        progressDialog.dismiss()
                    }
    
    12.07.2021
    Новые материалы

    Учебные заметки JavaScript Object Oriented Labs
    Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

    Разбор строк запроса в vue.js
    Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

    Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
    «Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..