Проблема в вашем коде состоит в том, что конструктор в классе User
имеет значение private . Это не правильный способ создания нового экземпляра класса. JavaBeans требует наличия конструктора без аргументов .
Когда Cloud Firestore SDK десериализует объекты, поступающие из базы данных, он требует, чтобы все используемые объекты имели этот publi c конструктор без аргументов, поэтому он может использовать его для создания экземпляра объекта. Поля в объектах устанавливаются с помощью методов установки publi c или прямого доступа к членам publi c, как вы уже попробовали.
Поскольку ваш конструктор является закрытым, SDK действительно не знает, как создать экземпляр этого. Поэтому обязательно изменить его как publi c. Правильный способ создания этого класса должен быть следующим:
class User {
private String name;
private String surname;
private long lastLogin;
private boolean blocked = false;
public User() {} //Needed for Cloud Firestore
public User(String name, String surname, long lastLogin, boolean blocked) {
this.name = name;
this.surname = surname;
this.lastLogin = lastLogin;
this.blocked = blocked;
}
//Getters and setters are not mandatory
}
Также обратите внимание, что установщики и получатели не требуются. Установщики всегда являются необязательными, потому что если для свойства JSON нет установщика, клиент Firebase установит значение непосредственно в поле.
Редактировать:
Согласно вашему комментарию:
, но это не объясняет, почему некоторые поля работают, а другие нет. Это не должно работать вообще, верно?
Да, все верно, все должно работать. Причина, по которой некоторые из них не работают, заключается в том, что свойство blocked
в вашем классе User
имеет тип boolean
, а в вашей базе данных имеет тип String
, и это неверно. Оба типа должны совпадать.
А закрытый конструктор связан с экземпляром синглтона, насколько я знаю, конструктор должен быть закрытым, чтобы избежать создания новых экземпляров класса.
Нет , конструктор должен быть опубликован c. Я думаю, что есть недоразумение. Каждый раз, когда вы используете FirebaseDatabase.getInstance()
, открывается одно-сокетное соединение между вашим приложением и серверами Firebase. С этого момента весь трафик c между приложением и базой данных проходит через один сокет. Поэтому не имеет значения, сколько раз вы создаете экземпляр, это всегда будет одно соединение. Что касается вашего класса POJO, такой Singleton не нужен, потому что Firebase всегда должен знать, как создать экземпляр этого класса, используя конструктор publi c без аргументов.