2016-08-28 3 views
0

Ich versuche meine Schichten zu isolieren, wenn ich eine Anwendung erstelle, die für mehrere Jahre gewartet wird. Ich verwende Realm als Datenbank, Retrofit als Netzwerkschicht und RxJava/RxAndroid als Kommunikationsschicht in der MVP/MVVM-Architektur. In Zukunft möchte ich, dass jeder, der dieses Projekt aufgreift, in der Lage ist, einfach Realm zu tauschen oder Retrofit auszutauschen, sagen wir, wenn eine bessere Bibliothek herauskommt, die sich für zukünftige Verbesserungen eignet.Verwenden von Generics mit Realm + RxJava

Also, zu diesem Zweck versuche ich eine generische Datenbank-Schnittstelle zu bauen, und dann meine konkrete Realm-Implementierung darüber zu bauen.

Ich habe eine IDatabaseManager Schnittstelle wie folgt definiert: ‚?‘

public interface IDatabaseManager<E extends AbstractList<? extends T>, T> { 
    void save(T object); 
    Observable<E> getAsObservable(Class<?> type); 
} 

Die Idee ist, ich der Datenbankmanager wollen Typ E haben, die einige Liste/Sammlung einer Klasse ist wodurch ein Basisobjekt erweitert wird (für diejenigen ORMs, in denen Sie eine Basisklasse erweitern müssen).

Dann habe ich meine konkrete Umsetzung, die Reich nutzt:

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(); 
    } 
} 

aber ich erhalte eine Fehlermeldung auf "Typ", dass:

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-Abfragen durchführt, indem in Einnahme eine Klasse der Objektsammlung, die Sie abfragen, wobei das Objekt RealmObject (abstrakt) erweitern oder RealmModel (Schnittstelle) implementieren muss, aber sie sollen austauschbar sein.

Irgendwelche Hilfe hier? Ich glaube, ich bin nur eine Syntax hier vermasselt und ich kann einfach nicht herausfinden, wie ich das Problem beheben kann =/

Antwort

0

Ihre erste Frage wird von

beantwortet
@Override 
    <T extends RealmModel> Observable<RealmResults<T> getAsObservable(Class<T> type) { 
    Realm realm = realm.getDefaultInstance(); 
    return realm.where(type).findAllAsync().asObservable(); 
    } 

Aber in Wirklichkeit, wenn Sie wollen Um "Realm" einfach austauschen zu können, müssen Sie die Zero-Copy-Auswertung und das Live-Autoupdate aufgeben, um die Realm-Objekte zu kopieren.

return Observable.defer(() -> { 
    try(Realm realm = Realm.getDefaultInstance()) { 
     return Observable.just(realm.copyFromRealm(realm.where(type).findAll())); 
    } 
}).subscribeOn(Schedulers.io()); 

(obwohl das besiegt irgendwie den Zweck, wenn Sie mich fragen - nach allem, Realm wurde so konzipiert, dass Sie alles aus dem Speicher nicht kopieren müssen)

Verwandte Themen