#android #firebase #google-cloud-firestore
#Android #firebase #google-облако-firestore
Вопрос:
У меня проблема с сохранением данных (имя, фамилия, адрес электронной почты) в базе данных FireStore. Авторизация работает отлично — добавляются новые пользователи. Но затем я хочу сохранить эти 3 переменные из типа EditText в AndroidStudio в качестве нового документа Firebase. Но затем внезапно появляется ошибка в консоли:
Process: com.example.poduszkowoapp, PID: 7276
java.lang.IllegalArgumentException: Invalid data. Unsupported type: androidx.appcompat.widget.AppCompatEditText (found in field Email)
at com.google.firebase.firestore.core.UserData$ParseContext.createError(com.google.firebase:firebase-firestore@@17.1.2:293)
at com.google.firebase.firestore.UserDataConverter.parseScalarValue(com.google.firebase:firebase-firestore@@17.1.2:405)
at com.google.firebase.firestore.UserDataConverter.parseData(com.google.firebase:firebase-firestore@@17.1.2:254)
at com.google.firebase.firestore.UserDataConverter.parseMap(com.google.firebase:firebase-firestore@@17.1.2:274)
at com.google.firebase.firestore.UserDataConverter.parseData(com.google.firebase:firebase-firestore@@17.1.2:230)
at com.google.firebase.firestore.UserDataConverter.parseSetData(com.google.firebase:firebase-firestore@@17.1.2:75)
at com.google.firebase.firestore.DocumentReference.set(com.google.firebase:firebase-firestore@@17.1.2:172)
at com.google.firebase.firestore.DocumentReference.set(com.google.firebase:firebase-firestore@@17.1.2:152)
at com.example.poduszkowoapp.RegisterActivity$1$2.onComplete(RegisterActivity.java:90)
at com.google.android.gms.tasks.zzj.run(Unknown Source:4)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Код этого раздела в регистре активности, при котором возникают проблемы:
fAuth.createUserWithEmailAndPassword(txtEmail.getText().toString(),txtPassword.getText().toString()).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if(task.isSuccessful())
{
userID = fAuth.getCurrentUser().getUid();
Map<String, Object> userMap = new HashMap<>();
userMap.put("Name", txtName);
userMap.put("Surname", txtSurname);
userMap.put("Email", txtEmail);
fStore.collection("users").document(userID).set(userMap).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Toast.makeText(RegisterActivity.this, "Registered succesfully", Toast.LENGTH_SHORT).show();
startActivity(new Intent(getApplicationContext(), MainActivity.class));
finish();
}
});
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
if(e instanceof FirebaseAuthUserCollisionException)
{
Toast.makeText(RegisterActivity.this, "This email address is already taken", Toast.LENGTH_LONG).show();
}
}
});
Ответ №1:
Похоже, вы передаете экземпляры Android views в Firestore:
Map<String, Object> userMap = new HashMap<>();
userMap.put("Name", txtName);
userMap.put("Surname", txtSurname);
userMap.put("Email", txtEmail);
Если txtEmail
и другие являются объектами Android view, это вообще не сработает. Firestore ничего не знает о представлениях Android. Вам нужно написать код для извлечения строковых значений из виджетов и передачи этих строк в Firestore. Например, чтобы получить строку из EditText:
userMap.put("Email", txtEmail.getText().toString());
Ответ №2:
Пусть ваша карта будет:
Map<String, Object> userMap = new HashMap<>();
userMap.put("Name", txtName.getText().toString());
userMap.put("Surname", txtSurname.getText().toString());
userMap.put("Email", txtEmail.getText().toString());
Вы записывали свой тип EditText в firestore вместо текста из него.