Почему Firebase считает, что ключ содержит.при установке нового значения? - PullRequest
0 голосов
/ 06 марта 2019

Я пытаюсь вставить объект в 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());
    }

1 Ответ

0 голосов
/ 06 марта 2019

Это может стать ясно из моего последнего редактирования, но кажется, что реализация Parcelable и попытка чтения / записи неинициализированных полей - вот что вызывает проблему.Если я удаляю неинициализированные поля из реализации Parcelable, setValue () работает как положено.

    protected User(Parcel in) {
        username = in.readString();
        email = in.readString();
        //name = in.readString();
        //location = in.readParcelable(Location.class.getClassLoader());
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(username);
        dest.writeString(email);
        //dest.writeString(name);
        //location.writeToParcel(dest, flags);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...