登录用户或管理员

时间:2019-10-20 14:56:39

标签: android firebase-realtime-database

请帮助我解决以下错误:

com.google.firebase.database.DatabaseException: Invalid Firebase Database path: iman@gmail.com. Firebase Database paths must not contain '.', '#', '$', '[', or ']'
        at com.google.firebase.database.core.utilities.Validation.validatePathString
at com.example.quizapp.SignInActivity$3.onDataChange(SignInActivity.java:85)

我的代码:

public class SignInActivity extends AppCompatActivity {

    private EditText memail;
    private EditText mpassword;
    private Button mlogin;
    private Button mregister;
    private ProgressBar mpgbar;
    private FirebaseAuth mAuth;
    FirebaseDatabase database;
    DatabaseReference users;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sign_in);
        database = FirebaseDatabase.getInstance();
        users = database.getReference("User");
        mAuth = FirebaseAuth.getInstance();
        memail = findViewById(R.id.emailtv);
        mpassword = findViewById(R.id.passwordtv);
        mlogin = findViewById(R.id.loginBtn);
        mregister = findViewById(R.id.regBtn);
        mpgbar = findViewById(R.id.progressBar);

        mregister.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(SignInActivity.this, RegisterActivity.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(intent);
                finish();
                return;
            }
        });

        mlogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
               LoginUser(memail.getText().toString(),mpassword.getText().toString());
            }
        });

    }

    private void LoginUser(final String email, final String pwd) {

        if(isEmpty()) return;
        inProgress(true);
        users.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if(dataSnapshot.child(email).exists())
                {
                    if(!email.isEmpty())
                    {
                        User login = dataSnapshot.child(email).getValue(User.class);
                        if(login.getType().equalsIgnoreCase("Admin"))
                        {
                            mAuth.signInWithEmailAndPassword(email,pwd)
                                    .addOnSuccessListener(new OnSuccessListener<AuthResult>() {
                                        @Override
                                        public void onSuccess(AuthResult authResult) {
                                            Toast.makeText(SignInActivity.this, "User signed in", Toast.LENGTH_LONG).show();
                                            Intent intent = new Intent(SignInActivity.this, AdminPage.class);
                                            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                                            startActivity(intent);
                                            finish(); return;
                                        }
                                    });
                        }
                        else if(login.getType().equalsIgnoreCase("User"))
                        {
                            if(isEmpty()) return;
                            inProgress(true);
                            mAuth.signInWithEmailAndPassword(memail.getText().toString(),mpassword.getText().toString())
                                    .addOnSuccessListener(new OnSuccessListener<AuthResult>() {
                                        @Override
                                        public void onSuccess(AuthResult authResult) {
                                            Toast.makeText(SignInActivity.this, "User signed in", Toast.LENGTH_LONG).show();
                                            Intent intent = new Intent(SignInActivity.this, Home.class);
                                            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                                            startActivity(intent);
                                            finish(); return;
                                        }
                                    });
                        }

                    }
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }

    private void inProgress(boolean x) {
        if (x) {
            mpgbar.setVisibility(View.VISIBLE);
            mlogin.setEnabled(false);
            mregister.setEnabled(false);
        } else {
            mpgbar.setVisibility(View.GONE);
            mlogin.setEnabled(true);
            mregister.setEnabled(true);
        }
    }

    private boolean isEmpty() {
        if (TextUtils.isEmpty(memail.getText().toString())) {
            memail.setError("REQUIRED");
            return true;
        }
        if (TextUtils.isEmpty(mpassword.getText().toString())) {
            mpassword.setError("REQUIRED");
            return true;
        }
        return false;
    }


}

Java第85行是if(dataSnapshot.child(email).exists())

1 个答案:

答案 0 :(得分:1)

您不能将某些东西用作带有特殊符号(例如'。'(点)的中间节点)

来自docs

  

如果您创建自己的密钥,则它们必须是UTF-8编码的,最多可以为768个字节,并且不能包含。,$,#,[,],/或ASCII控制字符0-31或127您也不能在值本身中使用ASCII控制字符。

您可以简单地使用用户的唯一ID作为密钥,或者如果您真的想使用电子邮件作为密钥,则替换所有的'。下划线“ _”或类似的内容;