在构建将要维护多年的应用程序时,我试图隔离我的图层。我使用Realm作为数据库,将Retrofit作为网络层,使用RxJava / RxAndroid作为MVP / MVVM架构中的通信层。在未来,我希望任何参与这个项目的人能够简单地换掉Realm或换掉Retrofit,比如说有更好的库可以用来进行未来的改进。
因此,为此,我尝试构建通用数据库接口,然后在其上构建我的具体Realm实现。
我有一个IDatabaseManager接口,定义如下:
public interface IDatabaseManager<E extends AbstractList<? extends T>, T> {
void save(T object);
Observable<E> getAsObservable(Class<?> type);
}
我的想法是,我希望数据库管理器具有类型E,它是某些类的列表/集合&#39;?&#39;它扩展了一些基础对象(对于那些需要你扩展一些基类的ORM)。
然后,我有我的具体实现,它利用了领域:
public class RealmManager implements IDatabaseManager<RealmResults<? extends RealmObject>, RealmObject> {
@Override
void save(RealmObject object) {
//implementation works
}
@Override
Observable<RealmResults<? extends RealmObject>> getAsObservable(Class<?> type) {
Realm realm = realm.getDefaultInstance();
return realm.where(type).findAllAsync().asObservable();
}
}
然而,我在&#34;输入错误&#34;的是:
where (java.lang.Class<E>) in Realm cannot be applied
to (java.lang.Class<capture<?>>)
reason: inference variable E has incompatible bounds:
equality constraints: capture of ?
upper bounds: Realm Model
Realm通过接受您要查询的对象集合的类来执行查询,该对象必须扩展RealmObject(抽象),或实现RealmModel(接口),但它们应该是可互换的。
这里有什么帮助吗?我想我只是弄乱了一些语法,我只是无法弄清楚如何解决它= /
答案 0 :(得分:0)
您的初步问题由
回答 @Override
<T extends RealmModel> Observable<RealmResults<T> getAsObservable(Class<T> type) {
Realm realm = realm.getDefaultInstance();
return realm.where(type).findAllAsync().asObservable();
}
但实际上,如果您希望能够简单地换掉Realm&#34;,那么您将不得不放弃零拷贝评估和实时自动更新,转而支持复制领域对象。
return Observable.defer(() -> {
try(Realm realm = Realm.getDefaultInstance()) {
return Observable.just(realm.copyFromRealm(realm.where(type).findAll()));
}
}).subscribeOn(Schedulers.io());
(虽然如果你问我这个目的就失败了 - 毕竟,Realm的设计是为了让你不需要把所有东西都复制到记忆中)