Custom methods in RealmObjects… solution?

前端 未结 3 1941
广开言路
广开言路 2021-01-06 08:26

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.

3条回答
  •  梦谈多话
    2021-01-06 08:53

    EDIT: 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.


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

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

    And

    public abstract class BaseRealmRepositoryImpl
            implements RealmRepository {
        protected Class clazz;
    
        public BaseRealmRepositoryImpl(Class clazz) {
            this.clazz = clazz;
        }
    
        @Override
        public RealmResults findAll(Realm realm) {
            return query().findAll();
        }
    
        @Override
        public void insertOrUpdate(Realm realm, T t) {
            realm.insertOrUpdate(t);
        }
    
        @Override
        public void insertOrUpdate(Realm realm, Collection collection) {
            realm.insertOrUpdate(collection);
        }
    
        @Override
        public T saveOrUpdate(Realm realm, T t) {
            return realm.copyToRealmOrUpdate(t);
        }
    
        @Override
        public RealmList saveOrUpdate(Realm realm, RealmList list) {
            RealmList realmList = new RealmList<>();
            for(T t : realm.copyToRealmOrUpdate(list)) {
                realmList.add(t);
            }
            return realmList;
        }
    
        @Override
        public RealmQuery 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 realmResults) {
            realmResults.deleteAllFromRealm();
        }
    
        @Override
        public long count(Realm realm) {
            return query().count();
        }
    }
    

    And

    public abstract class StringRealmRepositoryImpl
            extends BaseRealmRepositoryImpl
            implements RealmRepository {
        public StringRealmRepositoryImpl(Class 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));
        }
    }
    

    And

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

    And

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

    And repositories are extensible.

提交回复
热议问题