【问题标题】:Can't write data into database firebase firestore无法将数据写入数据库 firebase firestore
【发布时间】:2020-04-02 07:46:34
【问题描述】:

我设法将数据插入身份验证,但无法插入数据库:

代码

fullname = findViewById(R.id.Ifullname);
        password = findViewById(R.id.Ipassword);
        email = findViewById(R.id.Iemail);
        RegisterBtn = findViewById(R.id.button);
        fAuth = FirebaseAuth.getInstance();
        fStore = FirebaseFirestore.getInstance();
        loginBtn = findViewById(R.id.LoginBtn);
RegisterBtn.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                String FullName = fullname.getText().toString().trim();
                String Password = password.getText().toString().trim();
                String Email = email.getText().toString().trim();
fAuth.createUserWithEmailAndPassword(Email, Password).addOnCompleteListener(new OnCompleteListener<AuthResult>(){
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task){
                        if(task.isSuccessful()){
                            Toast.makeText(Register.this, "User Created.", Toast.LENGTH_SHORT).show();
                            UserID = fAuth.getCurrentUser().getUid();
                            DocumentReference documentReference = fStore.collection("users").document(UserID);
                            Map<String,Object> user = new HashMap<>();
                            user.put("FName", fullname);
                            user.put("Email",email);
                            user.put("Password",password);
//problem seems to be this line  
documentReference.set(user).addOnSuccessListener(new OnSuccessListener<Void>() {
                                @Override
                                public void onSuccess(Void aVoid) {
                                    Log.d(TAG, "onSuccess: user Profile is created");
                                }

                            }).addOnFailureListener(new OnFailureListener() {
                                @Override
                                public void onFailure(@NonNull Exception e) {
                                    Log.d(TAG, "onFailure:"+e.toString());

                                }
                            });

错误

E/AndroidRuntime:致命异常:主进程: com.example.budgetingapp,PID:11507 java.lang.RuntimeException:找到 类上名称 getText 的吸气剂冲突 androidx.appcompat.widget.AppCompatEditText 在 com.google.firebase.firestore.util.CustomClassMapper$BeanMapper.(com.google.firebase:firebase-firestore@@21.4.1:629) 在 com.google.firebase.firestore.util.CustomClassMapper.loadOrCreateBeanMapperForClass(com.google.firebase:firebase-firestore@@21.4.1:377) 在 com.google.firebase.firestore.util.CustomClassMapper.serialize(com.google.firebase:firebase-firestore@@21.4.1:177) 在 com.google.firebase.firestore.util.CustomClassMapper.serialize(com.google.firebase:firebase-firestore@@21.4.1:140) 在 com.google.firebase.firestore.util.CustomClassMapper.serialize(com.google.firebase:firebase-firestore@@21.4.1:104) 在 com.google.firebase.firestore.util.CustomClassMapper.convertToPlainJavaTypes(com.google.firebase:firebase-firestore@@21.4.1:78) 在 com.google.firebase.firestore.UserDataReader.convertAndParseDocumentData(com.google.firebase:firebase-firestore@@21.4.1:231) 在 com.google.firebase.firestore.UserDataReader.parseSetData(com.google.firebase:firebase-firestore@@21.4.1:75) 在 com.google.firebase.firestore.DocumentReference.set(com.google.firebase:firebase-firestore@@21.4.1:166) 在 com.google.firebase.firestore.DocumentReference.set(com.google.firebase:firebase-firestore@@21.4.1:146) 在 com.example.budgetingapp.Register$1$1.onComplete(Register.java:95) 在 com.google.android.gms.tasks.zzj.run(未知来源:4) 在 android.os.Handler.handleCallback(Handler.java:873) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:193) 在 android.app.ActivityThread.main(ActivityThread.java:6669) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

【问题讨论】:

    标签: android google-cloud-firestore


    【解决方案1】:

    简而言之,您正在尝试将 TextField 本身添加到您的数据库中,而不是您创建的字符串。

    String FullName = fullname.getText().toString().trim();
    String Password = password.getText().toString().trim();
    String Email = email.getText().toString().trim();
    /* ... */
    user.put("FName", fullname);
    user.put("Email",email);
    user.put("Password",password);
    

    我建议采用一些命名约定来防止这种情况。我个人推荐&lt;short-object-type&gt;&lt;variable-name&gt;写成camelCase

    Button     #button   -> #btnRegister
    Button     #LoginBtn -> #btnLogin
    TextField  #fullname -> #txtFullName
    TextField  #email    -> #txtEmail
    TextField  #password -> #txtPwd
    

    有时将私有对象级变量与局部变量区分开来也很有用,通常是在名称的开头添加m(代表我的):

    mBtnRegister.setOnClickListener(...);
    Button btnScripted = new Button(...);
    

    您应该在camelCase(或UPPER_SNAKE_CASE 用于常量)中命名变量,而不是PascalCase,这样它们就不会被误认为是类、接口等。您可以通过查看语法来实际看到这一点突出显示 StackOverflow 的代码块。


    String fullname = txtFullName.getText().toString().trim();
    String password = txtPwd.getText().toString().trim();
    String email = txtEmail.getText().toString().trim();
    /* ... */
    user.put("fname", fullname);
    user.put("email", email);
    // do not store passwords!
    

    【讨论】:

    • 那我应该如何存储我的密码呢?仅在身份验证中而不是在用户数据库中?
    • Firebase 身份验证将安全地散列并为您存储密码散列。密码永远不应该存储在数据库中。在您代表用户登录服务的情况下,您应该使用 OAuth 或其他形式的访问令牌。
    • 但我确实检索了我的 textview 的 id 并输入了“全名”。所以,就我而言,你的 txtFullName 是我的全名。还是我理解错了?
    • 所以换句话说,如果我想在不手动存储的情况下更改密码,我仍然可以找回密码?
    • 修改密码时,必须在最近几分钟内重新登录,然后才能调用updatePassword()方法。如果用户不记得他们的密码,他们可以使用sendPasswordResetEmail() 方法。
    猜你喜欢
    • 1970-01-01
    • 2018-05-08
    • 2021-04-15
    • 2017-05-07
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多