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