Хотите добавить объект в Realm, но ссылка на объект создается из шаблона Builder. Realm запрашивает getter для атрибутов. Можно ли добавить объект в Realm без getter, но с классом Builder?Хотите добавить объект в Realm, но ссылка на объект создается из шаблона построителя
ответ
Нет, realm использует прокси-метод для назначения полей объекта. Вы должны рассмотреть возможность использования объектов Data Access - абстрактный интерфейс вокруг вашей базы данных. Создайте модель данных, которая будет использоваться вашим приложением и другой моделью (возможно, с теми же полями), ТОЛЬКО используется Realm. Это будет больше кода, но при этом вы будете независимы от реализации базы данных. Объект модели должен быть создан Builder, а затем принят интерфейсом базы данных someDao. В реализации этого интерфейса вы преобразуете этот объект в объект Realm.
Да, Realm использует прокси-методы для назначения полей объекта, но весь доступ к полю преобразуется в вызов метода прокси с помощью Realm-Transformer. – EpicPandaForce
Как и в случае с Eliminate @Boilerplate, вы можете создавать сборщики для своих объектов RealmObjects (обратите внимание, что поддержка AutoValue не включена, поскольку абстрактные классы не поддерживаются).
public class User extends RealmObject {
@PrimaryKey
String username;
String firstname;
String lastname;
int age;
public String getUsername() {
return username;
}
public String getFirstname() {
return firstname;
}
public String getLastname() {
return lastname;
}
public int getAge() {
return age;
}
}
Вы можете создать строитель так:
public final class UserBuilder {
private String username;
private String firstName;
private String lastName;
private int age;
public UserBuilder() {
}
public UserBuilder username(String username) {
this.username = username;
return this;
}
public UserBuilder firstName(String firstName) {
this.firstName = firstName;
return this;
}
public UserBuilder lastName(String lastName) {
this.lastName = lastName;
return this;
}
public UserBuilder age(int age) {
this.age = age;
return this;
}
public User build() {
User user = new User();
user.username = this.username;
user.firstName = this.firstName;
user.lastName = this.lastName;
user.age = this.age;
return user;
}
}
Это возможно, так 0.88.0 и выше, поскольку Realm-трансформер изменяет весь доступ к полевой метод прокси-вызовов.
Однако, с этой установкой, я не знаю, как вы бы надежно изменить управляемый RealmObject, так, чтобы сохранить отношения, важно использовать тот же управляемый объект (используйте findFirst()
и затем сеттер) - с учетом неуправляемого объект считается «новым» объектом, и сохранение его по сравнению с предыдущим объектом с тем же самым первичным ключом делает недействительными ссылки на объект.
Как строитель получает возможность добавлять геттеры в ваш класс? –