我设法将数据插入到身份验证,但无法插入数据库:
代码:
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:在com.google.firebase.firestore.util上的类androidx.appcompat.widget.AppCompatEditText上找到名称getText冲突的吸气剂.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的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:104处序列化(com.google.firebase:firebase-firestore @@ 21.4.1:140) ),网址为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.DocumentReference.set(com.google.com)上的com.google.firebase.firestore.UserDataReader.parseSetData(com.google.firebase:firebase-firestore @@ 21.4.1:75)。 firebase:firebase-firestore @@ 21.4.1:166)com.google.firebase.firestore.DocumentReference.set(com.google.firebase:firebase-firestore @@ 21.4.1:146)在com.google.firebase.firestore.DocumentReference.set(com.google.firebase:firebase-firestore @@ 21.4.1:166)上访问com.google.firebase.firestore的firebase-firestore @@ 21.4.1:75)。 DocumentReference.set(com.google.firebase:firebase-firestore @@ 21.4.1:146)在com.google.firebase.firestore.DocumentReference.set(com.google.firebase:firebase-firestore @@ 21.4.1:166)上访问com.google.firebase.firestore的firebase-firestore @@ 21.4.1:75)。 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。的android.os.Handler.dispatchMessage(Handler.java:99)的java:873),android.app.ActivityThread.main(ActivityThread.java:6669)的android.os.Looper.loop(Looper.java:193)的com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run(RuntimeInit.java:493)上com.android.internal.os.ZygoteInit.main(ZygoteInit.java)上的java.lang.reflect.Method.invoke(本机方法) :858)
简而言之,您尝试将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);
我建议采用一些命名约定来防止这种情况。我个人建议<short-object-type><variable-name>
用编写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
为常量)命名变量,而不是以in命名,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!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句