有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何将多种类型的用户重定向到各自的活动?

我正在Firebase上创建一个投票应用程序。我有3种类型的用户。到目前为止,我可以成功地将两种用户(学生、教师)重定向到各自的活动,在他们使用下面的代码登录之后,MY Users so far 但现在我必须添加另一个用户(管理员),和其他用户一样,管理员也应该在登录后重定向到他们自己的特定活动。我对如何为第三个用户修改代码感到困惑

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


        }
    };

共 (3) 个答案

  1. # 1 楼答案

    您需要另一个数据结构,带有usersroles/adminroles/teacherroles/student,然后检查哪个节点具有密钥(也与安全规则兼容)

    现在,您可以简单地删除else分支并查询所有三个节点

  2. # 2 楼答案

    这是我使用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()
                    }
    
  3. # 3 楼答案

    使用onlyeif (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);