¿Métodos personalizados en la solución RealmObjects …?

Estoy utilizando Realm como un módulo de datos en mi aplicación Android, aunque estoy corriendo en algunos problemas con respecto a cómo asignar métodos personalizados a objetos Realm. En el módulo coredata de iOS, tiene NSObjects que guardan en memoria y también permiten la maleabilidad dentro de sus respectivas clases. ¿Qué tipo de sistema puedo usar para evitar esto? Intenté hacer "clases de padres" para todos mis objetos de reino, pero esto no funcionó.

Por ejemplo: "TeacherRealm" sólo contendría los getters y setters para un objeto de profesor, mientras que "TeacherParent" permitiría al usuario ejecutar ciertos algoritmos para encontrar datos para un profesor. En la clase TeacherParent, intenté inicializar un TeacherRealm y en TeacherRealm, proporcioné un getter y setter para el objeto TeacherParent. Bajo y behold, mi clase de objeto TeacherRealm no admitía un objeto TeacherParent personalizado.

¿Alguien ha encontrado este problema / ha encontrado una solución? Sé que esto suena confuso, aunque puedo proporcionar más información si es necesario

EDIT: Realm 0.88.0 ha habilitado el uso de métodos personalizados y también puede implementar interfaces con sus objetos de dominio. Pero estoy manteniendo mi patrón de repositorio que era la respuesta original a continuación. La última versión en el momento de escribir es 0.88.1.


Creo firmemente que data objetos de data sólo deben contener datos, y la lógica debe ser independiente.

 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); } 

Y

 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(); } } 

Y

 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)); } } 

Y

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

Y

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

Y los repositorios son extensibles.

Estoy trabajando en una pregunta similar. Mi enfoque va a ser el uso de 'ayudante' métodos estáticos para lograr toda la lógica adicional. Pasar una instancia de mi tipo de objeto en la llamada al método.

Tengo la misma situación para encontrar un trabajo alrededor para la lógica de encargo en realmObjects.

Abuse el patrón del constructor para una manera cómoda.

Ejemplo :

 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(); } } } 

Cómo utilizar

 //create a reamlobject Information info = new Information.Create() .setText("Hello World"); .commit(); //modify the created info object new Information.Modify(info) .setValue(1) .commit(); 
  • Cómo manejar la migración de dominios si los usuarios omitir las actualizaciones
  • Consultar objetos Realm anidados encapsulados en RealmList en RealmResults
  • Realm.io / Dagger / Databinding en el mismo proyecto
  • Limitar el número de llamadas al usar Parse
  • Builder (android.content.Context) 'no es público en' io.realm.RealmConfiguration.Builder '. No se puede acceder desde el paquete exterior
  • Prueba de unidad de reino en Android
  • Android Realm - Objeto de Realm de paso usando Intent
  • Realm: cambia el nombre del campo para la migración
  • Android, usando Realm singleton en Aplicación
  • RealmBaseAdapter con encabezados de sección
  • Realm en Android - ¿Cómo seleccionar varios objetos por lista de identificadores (@PrimaryKey)?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.