2015-07-12 59 views
3

我正在使用Realm作为我的android应用程序中的数据模块,但我遇到了一些关于如何将自定义方法分配给Realm对象的问题。在iOS coredata模块中,您有NSObjects,它可以保存到内存中,并且可以在各自的类中提供可扩展性。我可以用什么样的系统来解决这个问题?我尝试为我的所有领域对象制作“Parent Classes”,但这不起作用。RealmObjects ...解决方案中的自定义方法?

例如:“TeacherRealm”只包含教师对象的获取者和设置者,而“TeacherParent”则允许用户运行某些算法以找到教师的数据。在TeacherParent类中,我尝试初始化一个TeacherRealm,并在TeacherRealm中为TeacherParent对象提供了一个getter和setter。低和看,我的TeacherRealm对象类不支持自定义TeacherParent对象。

有没有人遇到过这个问题/找到解决办法了?我知道这听起来令人困惑,但我可以在必要时提供更多信息

+1

为什么你不想将模型与在模型上执行操作的类分开?:confused: – Yaroslav

+1

你的TeacherRealm类的静态方法怎么样?'public static RealmResults findGoodTeachers(Realm realm,int teacherAge)' – beeender

回答

1

我正在通过类似的问题。我的方法将是使用静态'帮助'方法来实现所有额外的逻辑。在方法调用中传递我的对象类型的实例。

+0

是的,这就是我最终做的,它一直在努力 –

+0

k好的解决方法 – primax79

1

我有相同的情况来寻找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(); 
7

编辑:Realm 0.88.0 has enabled the usage of custom methods,并且还可以实现你的领域对象的接口。但是我保留了我的存储库模式,这是以下原始答案。撰写本文时的最新版本是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); 
    } 
} 

和存储库是可扩展的。

+1

我不明白TeacherRepositoryImpl中的方法getId和setId,看起来像什么都不做,你能解释一下吗? –

+1

@CarlosAlbertoMurillo有效的问题。我检查了我使用此设置的项目,因为我认为我为**添加了**,但显然我似乎无法在任何地方找到它们。我想在一段时间后,我不再需要它们了。所以我把它从答案中删除了,谢谢你的提示。 – EpicPandaForce

相关问题