Я пытаюсь вставить объект в Firebase, используя точный метод, описанный в руководствах по android-quickstart.Однако, когда я пытаюсь добавить нового пользователя с ключом uid
, он выдает исключение:
com.google.firebase.database.DatabaseException: Invalid key: . Keys must not contain '/', '.', '#', '$', '[', or ']'
at com.google.firebase.database.core.utilities.Validation.validateWritableKey(com.google.firebase:firebase-database@@16.1.0:120)
at com.google.firebase.database.core.utilities.Validation.validateWritableObject(com.google.firebase:firebase-database@@16.1.0:103)
at com.google.firebase.database.core.utilities.Validation.validateWritableObject(com.google.firebase:firebase-database@@16.1.0:104)
at com.google.firebase.database.DatabaseReference.setValueInternal(com.google.firebase:firebase-database@@16.1.0:293)
at com.google.firebase.database.DatabaseReference.setValue(com.google.firebase:firebase-database@@16.1.0:166)
....
Код, запускаемый перед этим:
/* FirebaseUser is created with emailAndPassword just before this and the
* uid is retrieved from that new user.
*/
DatabaseReference db = FirebaseDatabase.getInstance().getReference();
db = db.child("users");
db = db.child(uid);
Log.d(TAG, "Attempting to insert user at" + uid );
Log.d(TAG, db.toString());
db.setValue(user).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
Log.d(TAG, "User created at " + uid);
} else {
Log.w(TAG, task.getException());
}
}
});
Ивывод перед самым исключением:
D/FirebaseAuth: Notifying id token listeners about user ( gDGy7BIGvQWjnQ7yZVCsdkIbAzx1 ).
D/SignUpActivity: Attempting to insert user at gDGy7BIGvQWjnQ7yZVCsdkIbAzx1
D/SignUpActivity: https://my-app.firebaseio.com/users/gDGy7BIGvQWjnQ7yZVCsdkIbAzx1
D/FirebaseAuth: Notifying auth state listeners about user ( gDGy7BIGvQWjnQ7yZVCsdkIbAzx1 ).
В uid
из FirebaseUser явно нет недопустимых символов, поэтому я не уверен, откуда это исключение.
Редактировать: пользователь - это объект User с инициализированными полями электронной почты и имени пользователя и несколькими другими неинициализированными полями (имя и местоположение), которые еще не были реализованы.Эта операция setValue()
работала в предыдущей итерации кода.В текущей итерации пользователь также реализует Parcelable, чтобы пользователи могли передаваться между действиями.
Текущее объявление пользователя:
public class User implements Parcelable {
private String username;
private String email;
private String name;
private Location location;
public User() {}
public User(String username, String email) {
this.username = username;
this.email = email;
}
protected User(Parcel in) {
username = in.readString();
email = in.readString();
name = in.readString();
location = in.readParcelable(Location.class.getClassLoader());
}
public static final Creator<User> CREATOR = new Creator<User>() { ... };
public User(String username, String email) {
this.username = username;
this.email = email;
}
protected User(Parcel in) {
username = in.readString();
email = in.readString();
name = in.readString();
location = in.readParcelable(Location.class.getClassLoader());
}