2017-11-30 4 views
0

Ich habe eine Android-Anwendung mit einer Datenschicht durch eine Datenbank Ressource mit Raum zugänglich dargestellt. Dies sind zwei Methoden meiner DAOAndroid RxJava2 benachrichtigen neue Daten in eine Datenbank einfügen

@Query("SELECT * FROM user") 
Flowable<List<UserEntity>> getUsers(); 

@Insert(onConflict = OnConflictStrategy.REPLACE) 
void saveUser(final UserEntity user); 

Meine Aktivität onCreate Methode zeigt die Liste der Benutzer und lassen eine neue mit einem Formular einzufügen. Es zeichnen die beobachtbare wie folgt aus:

mUserViewModel.getUsers() 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe (this::populateList) 

Vereinfachte die Ansicht Modellimplementierung

public Flowable<List<User>> getUsers(){ 
    return repository.getUsers(); 
} 

ist Jetzt würde ich gerne wissen, was der beste Weg ist mein beobachtbar zu benachrichtigen, wenn ich erfolgreich einen neuen Benutzer einfügen in die Datenbank um die Benutzerliste zu aktualisieren?

Ist es korrekt, eine BehaviorProcessor<any value> zu verwenden, einen Wert jedes Mal ausgeben, wenn ich einen neuen Benutzer erfolgreich einfügen und den BehaviorProcessor als beobachtbar und zum Beispiel innerhalb der SwitchMap-Methode beobachten?

Dies ist ein Beispiel mit einem Filter:

BehaviorProcessor<String> mFilter = BehaviorProcessor.createDefault(DEFAULT_VALUE); 

public Flowable<List<User>> getUsers(){ 
    return repository.getUsers() 
     .switchMap(users -> mFilter.map(this::filterList)); 
} 

public void saveUser(User user){ 
    repository.saveUser(user); 
    filter.emit(DEFAULT_VALUE); 
} 

Auf diese Weise jedes Mal, wenn ich einen neuen Wert emittieren die beobachtbar ist neu geladen und die Teilnehmer die neuen Daten.

+0

Verwendung: public Complect saveuser (Benutzerbenutzer). Es ist einfacher –

+1

der Flowable zurückgegeben von 'GetUsers 'wird eine neue' List' mit allen Daten ausgeben, wenn die Daten in der Tabelle ändert (ein Benutzer hinzugefügt, gelöscht oder geändert) – LordRaydenMK

+0

@LordRaydenMK Dies, weil die Raum-Implementation tut es selbst? Was mache ich, wenn ich keinen Raum nutze und manuell ein Flowable von einem Iterable erzeuge? – lukaspp

Antwort

1

Wie ich bereits in den Kommentaren erwähnt habe, kümmert sich Room bereits um die Ausgabe eines Elements, wenn sich der Tisch ändert.

Um den anderen Teil Ihrer Frage hier zu adressieren, ist ein Beispielcode eines reaktiven Einkaufswagens. (Artikel statt Benutzer)

/** 
* Holds a list of items that has been added to the shopping cart 
* 
* @author Hannes Dorfmann 
*/ 
public class ShoppingCart { 
    private BehaviorSubject<List<Product>> itemsInShoppingCart = 
     BehaviorSubject.createDefault(Collections.emptyList()); 

    /** 
    * An observable to observe the items in the shopping cart 
    */ 
    public Observable<List<Product>> itemsInShoppingCart() { 
    return itemsInShoppingCart; 
    } 

    /** 
    * Adds a product to the shopping cart 
    */ 
    public Completable addProduct(Product product) { 
    List<Product> updatedShoppingCart = new ArrayList<>(); 
    updatedShoppingCart.addAll(itemsInShoppingCart.getValue()); 
    updatedShoppingCart.add(product); 
    itemsInShoppingCart.onNext(updatedShoppingCart); 
    return Completable.complete(); 
    } 

    /** 
    * Remove a product to the shopping cart 
    */ 
    public Completable removeProduct(Product product) { 
    List<Product> updatedShoppingCart = new ArrayList<>(); 
    updatedShoppingCart.addAll(itemsInShoppingCart.getValue()); 
    updatedShoppingCart.remove(product); 
    itemsInShoppingCart.onNext(updatedShoppingCart); 
    return Completable.complete(); 
    } 

    /** 
    * Remove a list of Products from the shopping cart 
    */ 
    public Completable removeProducts(List<Product> products) { 
    List<Product> updatedShoppingCart = new ArrayList<>(); 
    updatedShoppingCart.addAll(itemsInShoppingCart.getValue()); 
    updatedShoppingCart.removeAll(products); 
    itemsInShoppingCart.onNext(updatedShoppingCart); 
    return Completable.complete(); 
    } 
} 

-Code von here.

+0

Könnte ich die rxjava-Funktion wie subscribeOn verwenden, um den Remove auszuführen oder den Produktcode in einem anderen Thread hinzuzufügen? – lukaspp

+0

Ja, du kannst. Das gehört wahrscheinlich in den Client-Code -> in den Klassen, die den Warenkorb verwenden – LordRaydenMK

Verwandte Themen