0

我有一个DAO,如下所示。如何使用体系结构组件观察数据库删除事件

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

据我所知,我可以听到新的数据,如下所示。

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

但是如何知道帖子何时被删除?

回答

1

您会观察所有项目(LiveData<List<Post>>),并在新数据发生变化时立即收到通知。

您可能想要使用新的DiffUtil,它可以显示受影响的更改。

另一种方法是在删除后设置/更新LiveData的值。返回Long表示它返回已删除行的计数。

@Delete void delete(Post post) : Long 

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

我写了一个答案,为什么删除和插入不是在Android Room : LiveData callback of update insert?

+0

您在关于使用Single进行编辑之前的答案可以在评论中详细说明。 – Raghunandan

+0

不知道你的意思是:-)你可以使用某种DiffUtil(或者为此提供的Android助手)检查更改,或者使用通过使用另一个MutableLiveData <>发布的尝试改变。取决于用例。如果你有一个“大”列表,使用新的LiveData对象的方法是最好的方法。 –

+0

鼓励通过setValue()使用“DiffUtil例程”是否明智?我一直在使用data.setValue(),虽然后,但有些东西是不正确的。 – Relm

1

LiveData<List<Post>> getPosts();使用LiveData返回由任何insertupdate,或delete做的表更新LiveData

因此,如果您最初观察列表,那么您已经在观察insert/updates/deletes。