RealmObjects中的自定义方法...解决方案? [英] Custom methods in RealmObjects... solution?

查看:88
本文介绍了RealmObjects中的自定义方法...解决方案?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在我的android应用程序中将 Realm 用作数据模块,尽管我遇到了一些有关如何向Realm对象分配自定义方法的问题.在iOS coredata模块中,您具有NSObjects,它们可以保存到内存中并允许其各自类中的延展性.我可以使用哪种系统来解决此问题?我尝试为所有领域对象创建父类",但这没有用.

I am using Realm as a data module in my android application, though I am running into some problems regarding how to assign custom methods to Realm objects. In the iOS coredata module, you have NSObjects which save to memory and also permit malleability within their respective classes. What sort of system can I use to get around this? I tried making "Parent Classes" for all of my realm objects, but this didn't work.

例如:"TeacherRealm"将仅包含教师对象的获取器和设置器,而"TeacherParent"将允许用户运行某些算法以查找教师的数据.在TeacherParent类中,我尝试初始化TeacherRealm,而在TeacherRealm中,我为TeacherParent对象提供了一个获取器和设置器.瞧瞧,我的TeacherRealm对象类不支持自定义的TeacherParent对象.

For example: "TeacherRealm" would only contain the getters and setters for a teacher object, while "TeacherParent" would allow the user to run certain algorithms to find data for a teacher. In the TeacherParent class, I tried initializing a TeacherRealm and in TeacherRealm, I provided a getter and setter for the TeacherParent object. Low and behold, my TeacherRealm object class did not support a custom TeacherParent object.

有人遇到这个问题/找到解决方案了吗?我知道这听起来令人困惑,不过如有必要,我可以提供更多信息

Has anyone encountered this problem/found a solution to it? I know this sounds confusing, though I can provide more information if necessary

推荐答案

Realm 0.88.0启用了自定义方法的使用,您还可以使用Realm Objects实现接口.但是我保留我的存储库模式,这是下面的原始答案.撰写本文时,最新版本为0.88.1.

Realm 0.88.0 has enabled the usage of custom methods, and you can also implement interfaces with your Realm Objects. But I'm keeping my repository pattern that was the original answer below. Latest version at the time of writing is 0.88.1.

我坚信data对象应该只包含数据,并且逻辑应该分开.

I firmly believe that data objects should only contain data, and the logic should be separate.

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中的自定义方法...解决方案?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆