Пользовательские методы в решении RealmObjects …?

Я использую Realm в качестве модуля данных в своем приложении для Android, хотя у меня возникают некоторые проблемы, связанные с тем, как назначать специальные методы для объектов Realm. В модуле iOS coredata у вас есть NSObjects, которые сохраняются в памяти, а также позволяют ковкость в своих классах. Какую систему я могу использовать, чтобы обойти это? Я попытался сделать «Родительские классы» для всех объектов моего царства, но это не сработало.

Например: «TeacherRealm» будет содержать только геттеры и сеттеры для объекта учителя, в то время как «TeacherParent» позволит пользователю запускать определенные алгоритмы для поиска данных для учителя. В классе TeacherParent я попытался инициализировать TeacherRealm и в TeacherRealm, я предоставил getter и setter для объекта TeacherParent. Низкий и вот, мой класс объектов TeacherRealm не поддерживает пользовательский объект TeacherParent.

Кто-нибудь столкнулся с этой проблемой / нашел решение? Я знаю, это звучит запутанно, хотя я могу предоставить дополнительную информацию, если необходимо

EDIT: Realm 0.88.0 включил использование пользовательских методов , а также вы можете реализовать интерфейсы с вашими объектами Realm. Но я сохраняю свой шаблон репозитория, который был исходным ответом ниже. Последняя версия на момент написания статьи – 0.88.1.


Я твердо верю, что объекты data должны содержать только данные, а логика должна быть отдельной.

 public interface RealmRepository<T extends RealmObject, ID extends Serializable> { T findOne(Realm realm, ID id); RealmResults<T> findAll(Realm realm); void insertOrUpdate(Realm realm, T t); void insertOrUpdate(Realm realm, Collection<T> t); T saveOrUpdate(Realm realm, T t); RealmList<T> saveOrUpdate(Realm realm, RealmList<T> tList); RealmQuery<T> query(Realm realm); void delete(Realm realm, ID id); void delete(Realm realm, T t); void deleteAll(Realm realm, RealmResults<T> realmResults); void deleteEveryObject(Realm realm); long count(Realm realm); } 

А также

 public abstract class BaseRealmRepositoryImpl<T extends RealmObject, ID extends Serializable> implements RealmRepository<T, ID> { protected Class<T> clazz; public BaseRealmRepositoryImpl(Class<T> clazz) { this.clazz = clazz; } @Override public RealmResults<T> findAll(Realm realm) { return query().findAll(); } @Override public void insertOrUpdate(Realm realm, T t) { realm.insertOrUpdate(t); } @Override public void insertOrUpdate(Realm realm, Collection<T> collection) { realm.insertOrUpdate(collection); } @Override public T saveOrUpdate(Realm realm, T t) { return realm.copyToRealmOrUpdate(t); } @Override public RealmList<T> saveOrUpdate(Realm realm, RealmList<T> list) { RealmList<T> realmList = new RealmList<>(); for(T t : realm.copyToRealmOrUpdate(list)) { realmList.add(t); } return realmList; } @Override public RealmQuery<T> query(Realm realm) { return realm.where(clazz); } @Override public void deleteEveryObject(Realm realm) { realm.delete(clazz); } @Override public void delete(Realm realm, T t) { t.deleteFromRealm(); } @Override public void deleteAll(Realm realm, RealmResults<T> realmResults) { realmResults.deleteAllFromRealm(); } @Override public long count(Realm realm) { return query().count(); } } 

А также

 public abstract class StringRealmRepositoryImpl<T extends RealmObject> extends BaseRealmRepositoryImpl<T, String> implements RealmRepository<T, String> { public StringRealmRepositoryImpl(Class<T> clazz) { super(clazz); } @Override public T findOne(Realm realm, String id) { return query(realm).equalTo(getIdFieldName(), id).findFirst(); } @Override public void delete(Realm realm, String id) { delete(realm, findOne(realm, id)); } } 

А также

 public class TeacherRealm extends RealmObject { @PrimaryKey private String id; //getter, setter, etc. } 

А также

 public class TeacherRepositoryImpl extends StringRealmRepositoryImpl<TeacherRealm> implements TeacherRepository { public TeacherRepositoryImpl() { super(TeacherRealm.class); } } 

И хранилища расширяемы.

Аналогичным образом я работаю над этим вопросом. Мой подход будет заключаться в использовании статических «вспомогательных» методов для достижения всей дополнительной логики. Передача экземпляра моего типа объекта в вызове метода.

У меня такая же ситуация, чтобы найти работу для пользовательской логики в realmObjects.

Я злоупотреблял шаблоном строителя для удобного способа.

Пример :

 public class Information extends RealmObject { @PrimaryKey private String id; private int value; private String text; //getter and setter for id, value and text //Helps to create and commit a information realm object public static class Create { private Realm realm; private Information information; public Create() { this.realm = Realm.getDefaultInstance(); this.realm.beginTransaction(); this.information = realm.createObject(Information.class); //init realmObject with defauls this.information.setId(UUID.randomUUID().toString()); this.information.setValue(0); this.information.setText(""); //space for additional logic } public Create setValue(int val) { this.information.setValue(val); //space for additional logic return this; } public Create setText(String s) { this.information.setText(s); //space for additional logic return this; } public Information commit() { //space for additional logic this.realm.commitTransaction(); return this.information; } } //Helps to modify and commit a information realm object public static class Modify { private Realm realm; private Information information; public Modify(Information information) { this.realm = Realm.getDefaultInstance(); this.information = information; this.realm.beginTransaction(); } public Modify setValue(int val) { this.information.setValue(val); //space for additional logic return this; } public Modify setText(String s) { this.information.setText(s); //space for additional logic return this; } public void commit() { //space for additional logic this.realm.commitTransaction(); } } } 

Как использовать

 //create a reamlobject Information info = new Information.Create() .setText("Hello World"); .commit(); //modify the created info object new Information.Modify(info) .setValue(1) .commit();