0

Ich habe ein DAO wie folgt.Wie Datenbank löschen Ereignisse mit Architecture Components

@Dao 
public interface PostDAO { 
    @Query("SELECT * FROM posts order by time DESC") 
    LiveData<List<Post>> getPosts(); 

    @Insert(onConflict = OnConflictStrategy.REPLACE) 
    @NonNull 
    void insert(Post... posts); 

    @Delete 
    void delete(Post post); 

    @Query("SELECT * FROM posts WHERE id = :id") 
    Post getPost(String id); 

    @Query("SELECT * FROM posts WHERE id = :id") 
    LiveData<Post> getPostLiveData(String id); 
} 

Ich verstehe, dass ich für neue hinzugefügte Daten mit etwas wie dem folgenden hören kann.

postDAO().getPosts().observe(builder.getLifecycleOwner(), data::postValue) 

Aber wie kann ich wissen, wenn ein Beitrag gelöscht wurde?

Antwort

1

Sie beobachten für alle Artikel (LiveData<List<Post>>) und werden mit den neuen Daten benachrichtigt, sobald sich etwas ändert.

Sie können das neue DiffUtil verwenden, das Ihnen die betroffenen Änderungen anzeigen kann.

Eine andere Möglichkeit besteht darin, den Wert Ihrer LiveData nach dem Löschen einzustellen/zu aktualisieren. Die Rückgabe von Long bedeutet, dass die Anzahl der gelöschten Zeilen zurückgegeben wird.

@Delete void delete(Post post) : Long 

LiveData data = new MutableLiveData<Post>() 
if (yourDao.delete(yourItem) > 0) data.setValue(yourItem) 

Ich schrieb eine Antwort, warum Löschen und Einfügen mit Livedata ist nicht Android Room : LiveData callback of update insert?

+0

Ihre Antwort vor der Änderung über die Verwendung von Single können Sie darauf im Kommentar näher eingehen. – Raghunandan

+0

Du weißt nicht, was du meinst :-) Du kannst entweder mit DiffUtil (oder dem dafür bereitgestellten Helfer) nach Änderungen suchen oder den Versuch mit einem anderen MutableLiveData <> verwenden, der benachrichtigt wird, sobald die Daten vorliegen geändert. Hängt vom Anwendungsfall ab. Wenn Sie eine "große" Liste haben, ist der Ansatz mit einem neuen LiveData-Objekt der beste Weg. –

+0

Sollte es nicht sinnvoll sein, die "DiffUtil-Routine" über setValue() zu empfehlen? Ich habe data.setValue(); benutzt, aber mit dem Post stimmt etwas nicht. – Relm

1

LiveData<List<Post>> getPosts(); gibt eine LiveData, die von jedem insert, update aktualisiert wird, oder delete zum Tabelle Beitrag getan.

Also, wenn Sie die Liste zunächst beobachten, dann beobachten Sie bereits für Inserts/Updates/löscht.

Verwandte Themen